All pastes #47291 Raw Edit

Mine

public text v1 · immutable
#47291 ·published 2006-03-28 12:11 UTC
rendered paste body
Index: java/net/sf/l2j/gameserver/SevenSigns.java
===================================================================
--- java/net/sf/l2j/gameserver/SevenSigns.java	(revisione 1681)
+++ java/net/sf/l2j/gameserver/SevenSigns.java	(copia locale)
@@ -1,49 +1,35 @@
 package net.sf.l2j.gameserver;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
+import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.Calendar;
-import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.logging.Logger;
 
-import javolution.util.FastList;
 import javolution.util.FastMap;
 import net.sf.l2j.Config;
 import net.sf.l2j.L2DatabaseFactory;
 import net.sf.l2j.gameserver.model.AutoChatHandler;
 import net.sf.l2j.gameserver.model.AutoSpawnHandler;
-import net.sf.l2j.gameserver.model.L2MinionData;
-import net.sf.l2j.gameserver.model.L2Spawn;
 import net.sf.l2j.gameserver.model.L2World;
-import net.sf.l2j.gameserver.model.AutoChatHandler.AutoChatInstance;
 import net.sf.l2j.gameserver.model.AutoSpawnHandler.AutoSpawnInstance;
-import net.sf.l2j.gameserver.model.actor.instance.L2MinionInstance;
-import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance;
-import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.serverpackets.SignsSky;
 import net.sf.l2j.gameserver.serverpackets.SystemMessage;
-import net.sf.l2j.gameserver.templates.L2NpcTemplate;
 import net.sf.l2j.gameserver.templates.StatsSet;
 
 /**
  *  Seven Signs Engine
  *    
  *  TODO: 
- *	- Currently all those in the winning cabal can enter the catacombs and necropolises.
- *		The official site says this is seal-based rather than winner-based. If so, then
- *		this needs to be factored in also.
  *  - Implementation of the Seal of Strife for sieges.
  *  
  *  @author Tempy
  */
-public class SevenSigns {
+public class SevenSigns 
+{
     protected static Logger _log = Logger.getLogger(SevenSigns.class.getName());
 	private static SevenSigns _instance;
 
@@ -85,6 +71,9 @@
 	public static final int PREACHER_NPC_ID = 8093;
     public static final int MAMMON_MERCHANT_ID = 8113;
     public static final int MAMMON_BLACKSMITH_ID = 8126;
+    public static final int MAMMON_MARKETEER_ID = 8092;
+    public static final int SPIRIT_IN_ID = 8111;
+    public static final int SPIRIT_OUT_ID = 8112;
     public static final int LILITH_NPC_ID = 10283;
     public static final int ANAKIM_NPC_ID = 10286;
 
@@ -97,194 +86,13 @@
 	public static final int SEAL_STONE_GREEN_VALUE = 5;
 	public static final int SEAL_STONE_RED_VALUE = 10; 
 
-	private static final int BLUE_CONTRIB_POINTS = 1;
-	private static final int GREEN_CONTRIB_POINTS = 5;
-	private static final int RED_CONTRIB_POINTS = 10;
+	public static final int BLUE_CONTRIB_POINTS = 3;
+	public static final int GREEN_CONTRIB_POINTS = 5;
+	public static final int RED_CONTRIB_POINTS = 10;
 
 	// There is a max on official, but not sure what!
-	private static final int MAXIMUM_PLAYER_CONTRIB = 300000;
+	public static final int MAXIMUM_PLAYER_CONTRIB = Math.round(1000000 * Config.RATE_DROP_ITEMS);
 	
-	// NPC Related Constants \\
-	private static final int [][] merchantSpawns = {
-		{172373, -17833, -4901}, // Disciples
-		{83175, 208998, -5439}, // Saints
-		{118343, 132578, -4831}, // Martyrs
-		{-52172, 78884, -4741}, // Ascetics
-		{-21657, 77164, -5173}, // Patriots
-		{111337, 173804, -5439}, // Worshippers
-		{45029, 123802, -5413}, // Pilgrims
-		{-41350, 209876, -5087}, // Sacrifice
-		};
-
-	private static final int [][] blacksmithSpawns = {
-		{114013, 84326, -6541}, // Forbidden Path
-		{-19360, 13278, -4901}, // Dark Omens
-		{140519, 79464, -5429}, // Witch
-		{77787, 78176, -5125}, // Apostate
-		{46303, 170091, -4981}, // Branded
-		{43093, 143706, -5381}, // Heretics
-		};
-			
-	private static final int[][] oratorSpawns = {
-		//Dion
-		{16901, 144748, -3027},
-        {17557, 147084, -3150},
-        {20826, 145769, -3171},
-        {19038, 142923, -3078},
-        //Oren
-        {81002, 53495, -1586},
-        {80039, 54291, -1586},
-        {81527, 56009, -1551},
-        //Aden
-		{143926, 26468, -2338},
-		{150417, 25182, -2141},
-        {147460, 20537, -2101},
-        //Giran
-		{85328, 147352, -3431},
-        {83872, 143882, -3431},
-        {81540, 144204, -3559},
-        {77830, 148627, -3623},
-        {81556, 152183, -3559},
-        //Hunters Village
-		{114907, 77916, -2662},
-        {115509, 74857, -2625},
-        {118273, 74592, -2529},
-		//Gludio
-        {-12344, 123605, -3132},
-        {-14199, 126128, -3171},
-        {-16168, 124129, -3143},
-        {-14563, 121461, -3015},
-		//Gludin
-        {-83157, 149846, -3155},
-        {-84356, 152742, -3204},
-        {-79563, 152726, -3204},
-        {-79123, 155098, -3204},
-        //Heine
-        {115482, 219266, -3689},
-        {107251, 218166, -3701}
-		};
-
-	private static final int[][] preacherSpawns = {
-		//Giran
-        {83319, 148054, -3431},
-		{83894, 147495, -3431},
-        {81547, 150347, -3559},
-        {79825, 148619, -3559},
-        {81535, 146866, -3559},
-        //Dion
-		{15722, 142877, -2732},
-        {18172, 145740, -3140},
-        {19096, 143980, -3096},
-        {19823, 145863, -3142},
-        //Gludin
-		{-80690, 149996, -3070},
-        {-83107, 150270, -3155},
-        {-83070, 152740, -3204},
-        {-80037, 154344, -3204},
-        {-80752, 152738, -3204},
-        //Gludio
-		{-12591, 122673, -3142},
-        {-13252, 123689, -3143},
-        {-14268, 124941, -3156},
-        {-15549, 124170, -3143},
-        {-14480, 122330, -3126},
-        //Heine
-		{111389, 219257, -3572},
-		{113479, 217795, -3731},
-        {114086, 220214, -3568},
-        {110189, 221393, -3569},
-        {107256, 218615, -3701},
-        {109660, 217339, -3775},
-        //Hunters Village
-        {117098, 77066, -2720},
-		{115893, 77551, -2729},
-        {115936, 75382, -2625},
-        {118049, 75783, -2715},
-        //Oren
-		{82863, 53290, -1522},
-        {80617, 54116, -1586},
-        {80416, 55959, -1586},
-        {82048, 55417, -1551},
-        //Aden
-        {147440, 30047, -2487},
-        {145394, 27629, -2295},
-        {149515, 27641, -2295},
-        {149899, 24719, -2167},
-        {147459, 21148, -2167},
-        {145015, 25269, -2167},
-        {146616, 25816, -2039},
-		{148013, 27029, -2231}
-		};
-
-	public static final String[] chatDoomPreacher =	{
-        "The prophecy of doom has awoken!", 
-		"All is lost! Prepare to meet the goddess of death!",
-		"All is lost! The prophecy of destruction has been fulfilled!",
-		"This world will soon be annihilated!",
-		"%player_cabal_loser%! You might as well give up!",
-		"%player_cabal_loser%! You bring an ill wind!",
-		"A curse upon you!",
-		"%player_cabal_loser%! All is lost! Prepare to meet the goddess of death!"
-		};
-	
-	public static final String[] chatOratorRevelations = {
-		"%player_cabal_winner%, the time for glory is at hand!", 
-		"The prophecy of darkness has been fulfilled!",
-        "The prophecy of darkness has come to pass!",
-        "As foretold in the prophecy of darkness, the era of chaos has begun!",
-        "The day of judgment is near!",
-        "%player_cabal_winner%, Darkness shall be banished forever!",
-		"All hail the eternal twilight!",
-		"%player_cabal_winner%! I bestow on you the authority of the abyss!"
-		};
-	
-	// Current max of 30 items sellable right now.
-    // Updated to include official prices as well as "modern" adena price.
-	public static final String[][] priestItems = {
-		// Greater Healing Potion
-		{"1539","1080","90","icon.etc_reagent_white_i00"},
-        // Blessed Rez Scroll for Pet
-        {"6387","6000","500","etc_scroll_of_resurrection_pet_i01"},
-        // Greater Haste Potion
-        {"1374","3600","360","etc_lesser_potion_green_i00"},
-        // Greater Swift Attack Potion
-        {"1375","7200","600","etc_lesser_potion_purple_i00"},
-        // Greater Magic Haste Potion
-        {"6036","7200","600","etc_potion_of_acumen3_i00"},
-        // CP Potion
-        {"5591","240","20","etc_cp_potion_i00"},
-        // Greater CP Potion
-        {"5592","600","50","etc_cp_potion_i01"},        
-        // SP Scroll - Low Grade
-        {"5593","2400","200","etc_sp_scroll1_i00"},
-        // SP Scroll - Medium Grade
-        {"5594","24000","2000","etc_sp_scroll2_i00"},
-        // SP Scroll - High Grade
-        {"5595","480000","40000","etc_sp_scroll3_i00"},
-		// Mystery Potion 
-		{"5234","12000","1000","etc_lesser_potion_clear_i00"},
-        // Facelifting Potions A-C
-		{"5235","24000","2000","etc_lesser_potion_purple_i00"}, {"5236","24000","2000","etc_lesser_potion_purple_i00"}, 
-        {"5237","24000","2000","etc_lesser_potion_purple_i00"}, 
-        // Hair Dye Potions A-D
-		{"5238","24000","2000","etc_lesser_potion_scarlet_i00"}, {"5239","24000","2000","etc_lesser_potion_scarlet_i00"}, 
-        {"5240","24000","2000","etc_lesser_potion_scarlet_i00"}, {"5241","24000","2000","etc_lesser_potion_scarlet_i00"}, 
-        // Hair Style Change Potion A-G
-		{"5242","24000","2000","etc_lesser_potion_green_i00"}, {"5243","24000","2000","etc_lesser_potion_green_i00"}, 
-        {"5244","24000","2000","etc_lesser_potion_green_i00"}, {"5245","24000","2000","etc_lesser_potion_green_i00"}, 
-        {"5246","24000","2000","etc_lesser_potion_green_i00"}, {"5247","24000","2000","etc_lesser_potion_green_i00"}, 
-		// Party Masks
-		{"5808","600000","50000","etc_party_mask_i00"}, {"6394","600000","50000","etc_party_mask_i01"},
-        // Squeaking Shoes
-        {"5590","420000","35000","armor_cloth_shoes_i00"},
-		// Record of the Seven Signs
-		{"5707","600","50","etc_ssq_scroll_i00"}
-        // Luck Charms 
-        //{"5703","5000","etc_charm_of_luck_i00"},{"5803","7500","etc_charm_of_luck_i00"},
-        //{"5804","11000","etc_charm_of_luck_i00"},{"5805","15000","etc_charm_of_luck_i00"},{"5806","21000","etc_charm_of_luck_i00"},
-        //{"5807","28500","etc_charm_of_luck_i00"},
-		}; // Total: 28 Items
-
 	private final Calendar _calendar = Calendar.getInstance();
 	
     protected int _activePeriod;
@@ -296,10 +104,7 @@
     protected int _compWinner;
     protected int _previousWinner;
     
-	private boolean _initializedSpawns;
-
 	private Map<Integer, StatsSet> _signsPlayerData;
-	private List<L2NpcInstance> _signsNPCInsts;
 	
 	private Map<Integer, Integer> _signsSealOwners;
 	private Map<Integer, Integer> _signsDuskSealTotals;
@@ -307,18 +112,23 @@
     
     private static AutoSpawnInstance _merchantSpawn;
     private static AutoSpawnInstance _blacksmithSpawn;
-    private static AutoChatInstance _preacherChat;
-    private static AutoChatInstance _oratorChat;
+    private static AutoSpawnInstance _spiritInSpawn;
+    private static AutoSpawnInstance _spiritOutSpawn;
+    private static AutoSpawnInstance _lilithSpawn;
+    private static AutoSpawnInstance _anakimSpawn;
+    private static Map<Integer, AutoSpawnInstance> _oratorSpawns;
+    private static Map<Integer, AutoSpawnInstance> _preacherSpawns;
+    private static Map<Integer, AutoSpawnInstance> _marketeerSpawns;
 	
 	public SevenSigns() 
 	{
 		_signsPlayerData = new FastMap<Integer, StatsSet>();
-		_signsNPCInsts = new FastList<L2NpcInstance>();
 		_signsSealOwners = new FastMap<Integer, Integer>();
 		_signsDuskSealTotals = new FastMap<Integer, Integer>();
 		_signsDawnSealTotals = new FastMap<Integer, Integer>();		
 		
-		try {
+		try 
+		{
 			restoreSevenSignsData();
 		}
 		catch (Exception e) {
@@ -329,9 +139,15 @@
 		initializeSeals();
 		
 		if (isSealValidationPeriod())
-            _log.info("SevenSigns: The " + getCabalName(getCabalHighestScore()) + " were victorious last week.");
+			if (getCabalHighestScore() == CABAL_NULL)
+	            _log.info("SevenSigns: The Competition last week ended with a tie.");
+			else
+	            _log.info("SevenSigns: The " + getCabalName(getCabalHighestScore()) + " were victorious last week.");
 		else 
-			_log.info("SevenSigns: The " + getCabalName(getCabalHighestScore()) + " are in the lead this week.");
+			if (getCabalHighestScore() == CABAL_NULL)
+				_log.info("SevenSigns: The Competition this week, if the trend continue, will end with a tie.");
+			else
+				_log.info("SevenSigns: The " + getCabalName(getCabalHighestScore()) + " are in the lead this week.");
 		
 		synchronized (this) 
 		{
@@ -354,6 +170,104 @@
 		}
 	}
 	
+	public void spawnSevenSignsNPC()
+	{
+		_merchantSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(MAMMON_MERCHANT_ID, false);
+		_blacksmithSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(MAMMON_BLACKSMITH_ID, false);
+		_marketeerSpawns = AutoSpawnHandler.getInstance().getAllAutoSpawnInstance(MAMMON_MARKETEER_ID);
+		_spiritInSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(SPIRIT_IN_ID, false);
+		_spiritOutSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(SPIRIT_OUT_ID, false);
+		_lilithSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(LILITH_NPC_ID, false);
+		_anakimSpawn = AutoSpawnHandler.getInstance().getAutoSpawnInstance(ANAKIM_NPC_ID, false);
+		_oratorSpawns = AutoSpawnHandler.getInstance().getAllAutoSpawnInstance(ORATOR_NPC_ID);
+		_preacherSpawns = AutoSpawnHandler.getInstance().getAllAutoSpawnInstance(PREACHER_NPC_ID);
+		
+		if (isSealValidationPeriod() || isCompResultsPeriod())
+		{
+			for (AutoSpawnInstance spawnInst: _marketeerSpawns.values())
+				AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, true);
+			
+			if (getSealOwner(SEAL_GNOSIS) == getCabalHighestScore() && getSealOwner(SEAL_GNOSIS) != CABAL_NULL)
+			{
+		        if (!Config.ANNOUNCE_MAMMON_SPAWN) 
+		            _merchantSpawn.setBroadcast(false);
+				
+		        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_merchantSpawn.getObjectId(), true).isSpawnActive())
+		        	AutoSpawnHandler.getInstance().setSpawnActive(_merchantSpawn, true);
+				for (AutoSpawnInstance spawnInst: _oratorSpawns.values())
+					if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(spawnInst.getObjectId(), true).isSpawnActive())
+						AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, true);
+				for (AutoSpawnInstance spawnInst: _preacherSpawns.values())
+					if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(spawnInst.getObjectId(), true).isSpawnActive())
+						AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, true);
+
+				if (!AutoChatHandler.getInstance().getAutoChatInstance(8093, false).isActive() && !AutoChatHandler.getInstance().getAutoChatInstance(8094, false).isActive())
+					AutoChatHandler.getInstance().setAutoChatActive(true);
+			}
+	        else
+	        {
+				AutoSpawnHandler.getInstance().setSpawnActive(_merchantSpawn, false);
+				for (AutoSpawnInstance spawnInst: _oratorSpawns.values())
+					AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, false);
+				for (AutoSpawnInstance spawnInst: _preacherSpawns.values())
+					AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, false);
+				AutoChatHandler.getInstance().setAutoChatActive(false);
+	        }
+			
+	        if (getSealOwner(SEAL_AVARICE) == getCabalHighestScore() && getSealOwner(SEAL_AVARICE) != CABAL_NULL)
+	        {
+		        if (!Config.ANNOUNCE_MAMMON_SPAWN) 
+		            _blacksmithSpawn.setBroadcast(false);
+
+		        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_blacksmithSpawn.getObjectId(), true).isSpawnActive())
+		        	AutoSpawnHandler.getInstance().setSpawnActive(_blacksmithSpawn, true);
+		        
+		        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_spiritInSpawn.getObjectId(), true).isSpawnActive())
+		        	AutoSpawnHandler.getInstance().setSpawnActive(_spiritInSpawn, true);
+		        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_spiritOutSpawn.getObjectId(), true).isSpawnActive())
+		        	AutoSpawnHandler.getInstance().setSpawnActive(_spiritOutSpawn, true);
+
+				switch (getCabalHighestScore())
+		        {
+		        	case CABAL_DAWN:
+				        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_lilithSpawn.getObjectId(), true).isSpawnActive())
+				        	AutoSpawnHandler.getInstance().setSpawnActive(_lilithSpawn, true);
+		        		AutoSpawnHandler.getInstance().setSpawnActive(_anakimSpawn, false);
+		        		break;
+		        	case CABAL_DUSK:
+				        if (!AutoSpawnHandler.getInstance().getAutoSpawnInstance(_anakimSpawn.getObjectId(), true).isSpawnActive())
+				        	AutoSpawnHandler.getInstance().setSpawnActive(_anakimSpawn, true);
+		        		AutoSpawnHandler.getInstance().setSpawnActive(_lilithSpawn, false);
+		        		break;
+		        }
+	        }
+	        else
+	        {
+				AutoSpawnHandler.getInstance().setSpawnActive(_blacksmithSpawn, false);
+				AutoSpawnHandler.getInstance().setSpawnActive(_lilithSpawn, false);
+				AutoSpawnHandler.getInstance().setSpawnActive(_anakimSpawn, false);
+				AutoSpawnHandler.getInstance().setSpawnActive(_spiritInSpawn, false);
+				AutoSpawnHandler.getInstance().setSpawnActive(_spiritOutSpawn, false);
+	        }
+		}
+		else
+		{
+			AutoSpawnHandler.getInstance().setSpawnActive(_merchantSpawn, false);
+			AutoSpawnHandler.getInstance().setSpawnActive(_blacksmithSpawn, false);
+			AutoSpawnHandler.getInstance().setSpawnActive(_lilithSpawn, false);
+			AutoSpawnHandler.getInstance().setSpawnActive(_anakimSpawn, false);
+			AutoSpawnHandler.getInstance().setSpawnActive(_spiritInSpawn, false);
+			AutoSpawnHandler.getInstance().setSpawnActive(_spiritOutSpawn, false);
+			for (AutoSpawnInstance spawnInst: _oratorSpawns.values())
+				AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, false);
+			for (AutoSpawnInstance spawnInst: _preacherSpawns.values())
+				AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, false);
+			for (AutoSpawnInstance spawnInst: _marketeerSpawns.values())
+				AutoSpawnHandler.getInstance().setSpawnActive(spawnInst, false);
+			AutoChatHandler.getInstance().setAutoChatActive(false);
+		}
+	}
+	
 	public static SevenSigns getInstance() {
 		if (_instance == null) {
 			_instance = new SevenSigns();
@@ -379,28 +293,47 @@
 		return reward;
 	}
 	
-	public static final String getCabalShortName(int cabal) {
-		return (cabal == CABAL_DUSK) ? "dusk" : "dawn";
+	public static final String getCabalShortName(int cabal) 
+	{
+		switch (cabal)
+		{
+			case CABAL_DAWN:
+				return "dawn";
+			case CABAL_DUSK:
+				return "dusk";
+		}
+		
+		return "No Cabal";
 	}
 	
-	public static final String getCabalName(int cabal) {
-		return (cabal == CABAL_DUSK) ? "Revolutionaries of Dusk" : "Lords of Dawn";
+	public static final String getCabalName(int cabal) 
+	{
+		switch (cabal)
+		{
+			case CABAL_DAWN:
+				return "Lords of Dawn";
+			case CABAL_DUSK:
+				return "Revolutionaries of Dusk";
+		}
+		
+		return "No Cabal";
 	}
 	
 	public static final String getSealName(int seal, boolean shortName) 
 	{
 		String sealName = (!shortName) ? "Seal of " : "";
 		
-		switch (seal) {
-		case SEAL_AVARICE:
-			sealName += "Avarice"; 
-			break;
-		case SEAL_GNOSIS:
-			sealName += "Gnosis";
-			break;
-		case SEAL_STRIFE:
-			sealName += "Strife";
-			break;
+		switch (seal) 
+		{
+			case SEAL_AVARICE:
+				sealName += "Avarice"; 
+				break;
+			case SEAL_GNOSIS:
+				sealName += "Gnosis";
+				break;
+			case SEAL_STRIFE:
+				sealName += "Strife";
+				break;
 		}
  
 		return sealName;
@@ -489,76 +422,106 @@
 	public final String getCurrentPeriodName() {
 		String periodName = null;
 		
-		switch (_activePeriod) {
-		case PERIOD_COMP_RECRUITING:
-			periodName = "Quest Event Initialization";
-			break;
-		case PERIOD_COMPETITION:
-			periodName = "Competition (Quest Event)";
-			break;
-		case PERIOD_COMP_RESULTS:
-			periodName = "Quest Event Results";
-			break;
-		case PERIOD_SEAL_VALIDATION:
-			periodName = "Seal Validation";
-			break;
+		switch (_activePeriod) 
+		{
+			case PERIOD_COMP_RECRUITING:
+				periodName = "Quest Event Initialization";
+				break;
+			case PERIOD_COMPETITION:
+				periodName = "Competition (Quest Event)";
+				break;
+			case PERIOD_COMP_RESULTS:
+				periodName = "Quest Event Results";
+				break;
+			case PERIOD_SEAL_VALIDATION:
+				periodName = "Seal Validation";
+				break;
 		}
 		
 		return periodName;
 	}
 	
-	public final boolean isSealValidationPeriod() {
+	public final boolean isSealValidationPeriod() 
+	{
 		return (_activePeriod == PERIOD_SEAL_VALIDATION);
 	}
 		
-	public final int getCurrentScore(int cabal) {
-		if (cabal == CABAL_DUSK)
-			return _duskStoneScore + _duskFestivalScore;
-		else if (cabal == CABAL_DAWN)
-			return _dawnStoneScore + _dawnFestivalScore;
-		else
-			return 1; // to prevent any divide by zero errors
+	public final boolean isCompResultsPeriod() 
+	{
+		return (_activePeriod == PERIOD_COMP_RESULTS);
 	}
+		
+	public final int getCurrentScore(int cabal) 
+	{
+		switch (cabal)
+		{
+			case CABAL_NULL:
+				return 0;
+			case CABAL_DAWN:
+				return _dawnStoneScore + _dawnFestivalScore;
+			case CABAL_DUSK:
+				return _duskStoneScore + _duskFestivalScore;
+		}
+		
+		return 0;
+	}
 	
-	public final int getCurrentStoneScore(int cabal) {
-		if (cabal == CABAL_DUSK)
-			return _duskStoneScore;
-		else if (cabal == CABAL_DAWN)
-			return _dawnStoneScore;
-		else
-			return 1; // to prevent any divide by zero errors
+	public final int getCurrentStoneScore(int cabal) 
+	{
+		switch (cabal)
+		{
+			case CABAL_NULL:
+				return 0;
+			case CABAL_DAWN:
+				return _dawnStoneScore;
+			case CABAL_DUSK:
+				return _duskStoneScore;
+		}
+		
+		return 0;
 	}
 	
-	public final int getCurrentFestivalScore(int cabal) {
-        if (cabal == CABAL_DUSK)
-            return _duskFestivalScore;
-        else if (cabal == CABAL_DAWN)
-            return _dawnFestivalScore;
-        else
-            return 1; // to prevent any divide by zero errors
+	public final int getCurrentFestivalScore(int cabal) 
+	{
+		switch (cabal)
+		{
+			case CABAL_NULL:
+				return 0;
+			case CABAL_DAWN:
+				return _dawnFestivalScore;
+			case CABAL_DUSK:
+				return _duskFestivalScore;
+		}
+		
+		return 0;
 	}
 	
-	public final int getCabalHighestScore() {
-		if (getCurrentScore(CABAL_DUSK) > getCurrentScore(CABAL_DAWN))
+	public final int getCabalHighestScore() 
+	{
+		if (getCurrentScore(CABAL_DUSK) == getCurrentScore(CABAL_DAWN))
+			return CABAL_NULL;
+		else if (getCurrentScore(CABAL_DUSK) > getCurrentScore(CABAL_DAWN))
 			return CABAL_DUSK;
-        
-        return CABAL_DAWN;
+		else
+			return CABAL_DAWN;
 	}
 	
-	public final int getSealOwner(int seal) {
+	public final int getSealOwner(int seal) 
+	{
 		return _signsSealOwners.get(seal);
 	}
 
-	public final int getSealProportion(int seal, int cabal) {
+	public final int getSealProportion(int seal, int cabal) 
+	{
 		if (cabal == CABAL_NULL)
-			return -1;
+			return 0;
 		else if (cabal == CABAL_DUSK)
 			return _signsDuskSealTotals.get(seal);
 		else
 			return _signsDawnSealTotals.get(seal);
 	}
 	
-	public int getTotalMembers(int cabal)
+	public final int getTotalMembers(int cabal)
 	{
 		int cabalMembers = 0;
 		String cabalName = getCabalShortName(cabal);
@@ -578,7 +541,8 @@
         return _signsPlayerData.get(player.getObjectId());
     }
 	
-	public int getPlayerStoneContrib(L2PcInstance player) {
+	public int getPlayerStoneContrib(L2PcInstance player) 
+	{
 		if (!hasRegisteredBefore(player))
 			return 0;
 		
@@ -586,270 +550,170 @@
 		
 		StatsSet currPlayer = _signsPlayerData.get(player.getObjectId());
 		
-		stoneCount += currPlayer.getInteger("red_stones");
-		stoneCount += currPlayer.getInteger("green_stones");
-		stoneCount += currPlayer.getInteger("blue_stones");
+		if (getPlayerCabal(player) == CABAL_DAWN)
+		{
+			stoneCount += currPlayer.getInteger("dawn_red_stones");
+			stoneCount += currPlayer.getInteger("dawn_green_stones");
+			stoneCount += currPlayer.getInteger("dawn_blue_stones");
+		}
+		else
+		{
+			stoneCount += currPlayer.getInteger("dusk_red_stones");
+			stoneCount += currPlayer.getInteger("dusk_green_stones");
+			stoneCount += currPlayer.getInteger("dusk_blue_stones");
+		}
 		
 		return stoneCount;
 	}
 	
-	public int getPlayerAdenaCollect(L2PcInstance player) {
+	public int getPlayerContribScore(L2PcInstance player) 
+	{
 		if (!hasRegisteredBefore(player))
 			return 0;
+		StatsSet currPlayer = _signsPlayerData.get(player.getObjectId());
 		
-		return _signsPlayerData.get(player.getObjectId()).getInteger("ancient_adena_amount");
+		if (getPlayerCabal(player) == CABAL_DAWN)
+			return currPlayer.getInteger("dawn_contribution_score");
+		else
+			return currPlayer.getInteger("dusk_contribution_score");
 	}
 	
-	public int getPlayerSeal(L2PcInstance player) {
+	public int getPlayerAdenaCollect(L2PcInstance player) 
+	{
 		if (!hasRegisteredBefore(player))
+			return 0;
+		
+		if (getPlayerCabal(player) == CABAL_DAWN)
+			return _signsPlayerData.get(player.getObjectId()).getInteger("dawn_ancient_adena_amount");
+		else
+			return _signsPlayerData.get(player.getObjectId()).getInteger("dusk_ancient_adena_amount");
+	}
+	
+	public int getPlayerSeal(L2PcInstance player) 
+	{
+		if (!hasRegisteredBefore(player))
 			return SEAL_NULL;
 			
 		return _signsPlayerData.get(player.getObjectId()).getInteger("seal");
 	}
 
-	public int getPlayerCabal(L2PcInstance player) {
+	public int getPlayerCabal(L2PcInstance player) 
+	{
 		if (!hasRegisteredBefore(player)) 
 			return CABAL_NULL;
 		
 		String playerCabal = getPlayerCabalStr(player);
 
-		if (playerCabal.equals(""))
-			return CABAL_NULL;
-		else if (playerCabal.equals("dawn")) 
+		if (playerCabal.equalsIgnoreCase("dawn"))
 			return CABAL_DAWN;
+		else if (playerCabal.equalsIgnoreCase("dusk"))
+			return CABAL_DUSK;
 		else
-			return CABAL_DUSK;
+			return CABAL_NULL;		
 	}
 	
-	public String getPlayerCabalStr(L2PcInstance player) {
+	public String getPlayerCabalStr(L2PcInstance player) 
+	{
 		return _signsPlayerData.get(player.getObjectId()).getString("cabal");
 	}
 	
     /**
-     * Registers all random spawns and auto-chats for Seven Signs NPCs, 
-     * along with spawns for the Preachers of Doom and Orators of Revelations 
-     * at the beginning of the Seal Validation period. 
-     */
-    public void spawnSevenSignsNPCs()
-    {
-        L2NpcTemplate npcTemplate = null;
-        
-        // Register the random auto spawns of the Mammon NPCs
-        _merchantSpawn = AutoSpawnHandler.getInstance().registerSpawn(8113, merchantSpawns, -1, -1, -1);
-        _merchantSpawn.setRandomSpawn(true);
-        
-        _blacksmithSpawn = AutoSpawnHandler.getInstance().registerSpawn(8126, blacksmithSpawns, -1, -1, -1);
-        _blacksmithSpawn.setRandomSpawn(true);
-        
-        if (Config.ANNOUNCE_MAMMON_SPAWN) {
-            _merchantSpawn.setBroadcast(true);
-            _blacksmithSpawn.setBroadcast(true);
-        }
-        
-        /* Set up the spawning and required auto chats. */
-        // First, do this for the Preachers of Doom
-        _preacherChat = AutoChatHandler.getInstance().registerGlobalChat(PREACHER_NPC_ID, SevenSigns.chatDoomPreacher, -1);
-        _preacherChat.setDefaultRandom(true);
-        
-        _oratorChat = AutoChatHandler.getInstance().registerGlobalChat(ORATOR_NPC_ID, SevenSigns.chatOratorRevelations, -1);
-        _oratorChat.setDefaultRandom(true);
-        
-        /*
-         * If the spawns have been initialized before don't try to do it again.
-         * Otherwise, create the spawns for the required monsters and minions.
-         */
-        if (_initializedSpawns)
-            return;
-        
-        try {
-            // First, do this for the Preachers of Doom \\
-            npcTemplate = NpcTable.getInstance().getTemplate(PREACHER_NPC_ID);
-            
-            for (int i = 0; i < preacherSpawns.length; i++) 
-            {   
-                L2Spawn npcSpawn = new L2Spawn(npcTemplate);
-                
-                npcSpawn.setLocx(preacherSpawns[i][0]);
-                npcSpawn.setLocy(preacherSpawns[i][1]);
-                npcSpawn.setLocz(preacherSpawns[i][2]);
-                npcSpawn.setAmount(1);
-                SpawnTable.getInstance().addNewSpawn(npcSpawn, false);
-                _signsNPCInsts.add(npcSpawn.doSpawn());
-                
-                if (Config.DEBUG)
-                    _log.info("SevenSigns: Spawned a Preacher at "
-                              + preacherSpawns[i][0] + " " + preacherSpawns[i][1] + " " + preacherSpawns[i][2]);
-            }
-            
-            // Now do the same again for the Orators of Revelations \\
-            npcTemplate = NpcTable.getInstance().getTemplate(ORATOR_NPC_ID);
-            
-            for (int i = 0; i < oratorSpawns.length; i++) 
-            {   
-                L2Spawn npcSpawn = new L2Spawn(npcTemplate);
-                
-                npcSpawn.setLocx(oratorSpawns[i][0]);
-                npcSpawn.setLocy(oratorSpawns[i][1]);
-                npcSpawn.setLocz(oratorSpawns[i][2]);
-                npcSpawn.setAmount(1);
-                SpawnTable.getInstance().addNewSpawn(npcSpawn, false);
-                _signsNPCInsts.add(npcSpawn.doSpawn());
-                
-                if (Config.DEBUG)
-                    _log.info("SevenSigns: Spawned an Orator at "
-                              + oratorSpawns[i][0] + " " + oratorSpawns[i][1] + " " + oratorSpawns[i][2]);
-            }
-            
-            /* Similarly, spawn either of the two major boss monsters and their minions.
-             * 
-             * If Dawn wins, spawn Lilith with 2 Lilith's Agent and 2 Lilith's Escort.
-             * If Dusk wins, spawn Anakim with 2 Anakim's Guardian and 2 Anakim's Royal Guard.
-             * 
-             */ 
-            final String bossName;
-            L2MinionData minionDat;
-            
-            if (getCabalHighestScore() == CABAL_DAWN) {
-                bossName = "Lilith";
-                npcTemplate = NpcTable.getInstance().getTemplate(LILITH_NPC_ID);
-                
-                minionDat = new L2MinionData();                 
-                minionDat.setMinionId(10284);
-                minionDat.setAmount(2);
-                npcTemplate.addRaidData(minionDat);
-                
-                minionDat = new L2MinionData();                 
-                minionDat.setMinionId(10285);
-                minionDat.setAmount(2);
-                npcTemplate.addRaidData(minionDat);
-            }
-            else {
-                bossName = "Anakim";
-                npcTemplate = NpcTable.getInstance().getTemplate(ANAKIM_NPC_ID);
-                
-                minionDat = new L2MinionData();                 
-                minionDat.setMinionId(10287);
-                minionDat.setAmount(2);
-                npcTemplate.addRaidData(minionDat);     
-                
-                minionDat = new L2MinionData();                 
-                minionDat.setMinionId(10288);
-                minionDat.setAmount(2);
-                npcTemplate.addRaidData(minionDat);       
-            }
-            
-            L2Spawn npcSpawn = new L2Spawn(npcTemplate);
-            npcSpawn.setLocx(184460);
-            npcSpawn.setLocy(-12015);
-            npcSpawn.setLocz(-5495);
-            npcSpawn.setRespawnDelay(86400); // Respawns every 24 hours.
-            npcSpawn.setAmount(1);
-            
-            SpawnTable.getInstance().addNewSpawn(npcSpawn, false);
-            _signsNPCInsts.add(npcSpawn.doSpawn());
-            
-            if (Config.DEBUG)
-                _log.info("SevenSigns: Spawned " + bossName + " with her minions.");
-        }
-        catch (Exception e) {
-            _log.warning("SevenSigns: Error while spawning period NPCs: " + e);
-        }
-        
-        _initializedSpawns = true;
-    } 
-	
-	/**
-	 * Used to remove random spawns and auto-chats at the beginning of a new Quest Event period.
-     * <BR>
-     * Also hides all Preachers of Doom and Orators of Revelations.
-	 */
-	protected void removeSevenSignsNPCs()
-	{
-		// Remove the random auto spawns of Mammon NPCs
-		AutoSpawnHandler.getInstance().removeSpawn(_merchantSpawn);
-		AutoSpawnHandler.getInstance().removeSpawn(_blacksmithSpawn);
-		
-		// Remove the auto chats of Seven Signs NPCs and hide them
-		AutoChatHandler.getInstance().removeChat(_preacherChat);
-		AutoChatHandler.getInstance().removeChat(_oratorChat);
-
-        // Remove all spawned NPCs and clean up the boss' minions.
-		for (L2NpcInstance npcInst : _signsNPCInsts) 
-        {
-            if (npcInst.getNpcId() == LILITH_NPC_ID || npcInst.getNpcId() == ANAKIM_NPC_ID) 
-            {
-                L2MonsterInstance monsterInst = (L2MonsterInstance)npcInst;
-                
-                for (L2MinionInstance minion : monsterInst.getSpawnedMinions())
-                    minion.deleteMe();
-            }
-            
-			npcInst.deleteMe();
-        }
-	}
-	
-    /**
      * Restores all Seven Signs data and settings, usually called at server startup.
      * 
      * @throws Exception
      */
-    protected void restoreSevenSignsData() throws Exception
+    protected void restoreSevenSignsData()
 	{
-		java.sql.Connection con = L2DatabaseFactory.getInstance().getConnection();
-        
-	    PreparedStatement statement = con.prepareStatement("SELECT char_obj_id, cabal, seal, red_stones, green_stones, blue_stones, " +
-	    	"ancient_adena_amount, contribution_score FROM seven_signs");
-	    ResultSet rset = statement.executeQuery();
+    	Connection con = null;
+    	PreparedStatement statement = null;
+    	ResultSet rset = null;
+		
+    	try
+    	{
+	    	con = L2DatabaseFactory.getInstance().getConnection();
+		    statement = con.prepareStatement("SELECT char_obj_id, cabal, seal, dawn_red_stones, dawn_green_stones, dawn_blue_stones, " +
+		    	"dawn_ancient_adena_amount, dawn_contribution_score, dusk_red_stones, dusk_green_stones, dusk_blue_stones, " +
+		    	"dusk_ancient_adena_amount, dusk_contribution_score FROM seven_signs");
+		    rset = statement.executeQuery();
+			    
+		    while (rset.next())
+		    {
+		    	int charObjId = rset.getInt("char_obj_id");
+		    	
+		    	StatsSet sevenDat = new StatsSet(); 
+				sevenDat.set("char_obj_id", charObjId);
+				sevenDat.set("cabal", rset.getString("cabal"));
+				sevenDat.set("seal", rset.getInt("seal"));
+				sevenDat.set("dawn_red_stones", rset.getInt("dawn_red_stones"));
+				sevenDat.set("dawn_green_stones", rset.getInt("dawn_green_stones"));
+				sevenDat.set("dawn_blue_stones", rset.getInt("dawn_blue_stones"));
+				sevenDat.set("dawn_ancient_adena_amount", rset.getInt("dawn_ancient_adena_amount"));
+				sevenDat.set("dawn_contribution_score", rset.getInt("dawn_contribution_score"));
+				sevenDat.set("dusk_red_stones", rset.getInt("dusk_red_stones"));
+				sevenDat.set("dusk_green_stones", rset.getInt("dusk_green_stones"));
+				sevenDat.set("dusk_blue_stones", rset.getInt("dusk_blue_stones"));
+				sevenDat.set("dusk_ancient_adena_amount", rset.getInt("dusk_ancient_adena_amount"));
+				sevenDat.set("dusk_contribution_score", rset.getInt("dusk_contribution_score"));
+	
+				if (Config.DEBUG)
+					_log.info("SevenSigns: Loaded data from DB for char ID " + charObjId + " (" + sevenDat.getString("cabal") + ")");
+				
+				_signsPlayerData.put(charObjId, sevenDat);
+		    }
 		    
-	    while (rset.next())
-	    {
-	    	int charObjId = rset.getInt("char_obj_id");
-	    	
-	    	StatsSet sevenDat = new StatsSet(); 
-			sevenDat.set("char_obj_id", charObjId);
-			sevenDat.set("cabal", rset.getString("cabal"));
-			sevenDat.set("seal", rset.getInt("seal"));
-			sevenDat.set("red_stones", rset.getInt("red_stones"));
-			sevenDat.set("green_stones", rset.getInt("green_stones"));
-			sevenDat.set("blue_stones", rset.getInt("blue_stones"));
-			sevenDat.set("ancient_adena_amount", rset.getInt("ancient_adena_amount"));
-			sevenDat.set("contribution_score", rset.getInt("contribution_score"));
-
-			if (Config.DEBUG)
-				_log.info("SevenSigns: Loaded data from DB for char ID " + charObjId + " (" + sevenDat.getString("cabal") + ")");
-			
-			_signsPlayerData.put(charObjId, sevenDat);
-	    }
-		    
-	    rset.close();
-		statement.close();	
-		con.close();
-		
-		Properties SevenSignsProp = new Properties();
-		InputStream is =  new FileInputStream(new File("./" + SEVEN_SIGNS_DATA_FILE));  
-		SevenSignsProp.load(is);
-		is.close();
-
-		_currentCycle = Integer.parseInt(SevenSignsProp.getProperty("CurrentCycle", "1"));
-		_activePeriod = Integer.parseInt(SevenSignsProp.getProperty("Period", String.valueOf(PERIOD_COMPETITION)));
-		_previousWinner = Integer.parseInt(SevenSignsProp.getProperty("PreviousWinner", String.valueOf(CABAL_NULL)));		
-		
-		_dawnStoneScore = Integer.parseInt(SevenSignsProp.getProperty("DawnStoneScore", "0"));
-        _dawnFestivalScore = Integer.parseInt(SevenSignsProp.getProperty("DawnFestivalScore", "0"));
-        _duskStoneScore = Integer.parseInt(SevenSignsProp.getProperty("DuskStoneScore", "0"));
-        _duskFestivalScore = Integer.parseInt(SevenSignsProp.getProperty("DuskFestivalScore", "0"));
- 
-		_signsSealOwners.put(SEAL_AVARICE, Integer.parseInt(SevenSignsProp.getProperty("AvariceOwner", String.valueOf(CABAL_NULL))));
-		_signsSealOwners.put(SEAL_GNOSIS, Integer.parseInt(SevenSignsProp.getProperty("GnosisOwner", String.valueOf(CABAL_NULL))));
-		_signsSealOwners.put(SEAL_STRIFE, Integer.parseInt(SevenSignsProp.getProperty("StrifeOwner", String.valueOf(CABAL_NULL))));
-		
-		_signsDawnSealTotals.put(SEAL_AVARICE, Integer.parseInt(SevenSignsProp.getProperty("AvariceDawnScore", "0")));
-		_signsDawnSealTotals.put(SEAL_GNOSIS, Integer.parseInt(SevenSignsProp.getProperty("GnosisDawnScore", "0")));
-		_signsDawnSealTotals.put(SEAL_STRIFE, Integer.parseInt(SevenSignsProp.getProperty("StrifeDawnScore", "0")));
-		_signsDuskSealTotals.put(SEAL_AVARICE, Integer.parseInt(SevenSignsProp.getProperty("AvariceDuskScore", "0")));
-		_signsDuskSealTotals.put(SEAL_GNOSIS, Integer.parseInt(SevenSignsProp.getProperty("GnosisDuskScore", "0")));
-		_signsDuskSealTotals.put(SEAL_STRIFE, Integer.parseInt(SevenSignsProp.getProperty("StrifeDuskScore", "0")));
-		
+		    rset.close();
+		    statement.close();
+			    
+	        statement = con.prepareStatement("SELECT * FROM seven_signs_status");
+	        rset = statement.executeQuery();
+	        
+	        while(rset.next())
+	        {
+	            _currentCycle = rset.getInt("current_cycle");
+	            _activePeriod = rset.getInt("active_period");
+	            _previousWinner = rset.getInt("previous_winner");  
+	            
+	            _dawnStoneScore = rset.getInt("dawn_stone_score");
+	            _dawnFestivalScore = rset.getInt("dawn_festival_score");
+	            _duskStoneScore = rset.getInt("dusk_stone_score");
+	            _duskFestivalScore = rset.getInt("dusk_festival_score");
+	     
+	            _signsSealOwners.put(SEAL_AVARICE, rset.getInt("avarice_owner"));
+	            _signsSealOwners.put(SEAL_GNOSIS, rset.getInt("gnosis_owner"));
+	            _signsSealOwners.put(SEAL_STRIFE, rset.getInt("strife_owner"));
+	            
+	            _signsDawnSealTotals.put(SEAL_AVARICE, rset.getInt("avarice_dawn_score"));
+	            _signsDawnSealTotals.put(SEAL_GNOSIS, rset.getInt("gnosis_dawn_score"));
+	            _signsDawnSealTotals.put(SEAL_STRIFE, rset.getInt("strife_dawn_score"));
+	            _signsDuskSealTotals.put(SEAL_AVARICE, rset.getInt("avarice_dusk_score"));
+	            _signsDuskSealTotals.put(SEAL_GNOSIS, rset.getInt("gnosis_dusk_score"));
+	            _signsDuskSealTotals.put(SEAL_STRIFE, rset.getInt("strife_dusk_score"));
+	        }
+	        
+	        rset.close();
+	        statement.close();
+	
+	        statement = con.prepareStatement("UPDATE seven_signs_status SET date=?");
+	        statement.setInt(1, Calendar.getInstance().get(Calendar.DAY_OF_WEEK));
+	        statement.execute();
+    	}
+    	catch (SQLException e)
+    	{
+    		_log.severe("Unable to load Seven Signs Data: " + e);
+    	}
+    	finally
+    	{
+    		try
+    		{
+	    		if (rset != null)
+	    			rset.close();
+	    		if (statement != null)
+	    			statement.close();
+	    		if (con != null)
+	    			con.close();
+    		}
+    		catch (SQLException e) {}
+    	}
 		// Festival data is loaded now after the Seven Signs engine data.
 	}
 	
@@ -864,75 +728,109 @@
 	 * @param updateSettings
 	 * @throws Exception
 	 */
-	public synchronized void saveSevenSignsData(L2PcInstance player, boolean updateSettings) throws Exception
+	public synchronized void saveSevenSignsData(L2PcInstance player, boolean updateSettings)
 	{
+		Connection con = null;
+		PreparedStatement statement = null;
+		
         if (Config.DEBUG)
             System.out.println("SevenSigns: Saving data to disk.");
         
-		java.sql.Connection con = L2DatabaseFactory.getInstance().getConnection();
-			
-	    for (StatsSet sevenDat : _signsPlayerData.values())
-	    {
-	    	if (player != null)
-	    		if (sevenDat.getInteger("char_obj_id") != player.getObjectId())
-	    			continue;
-	    	
-	    	PreparedStatement statement = con.prepareStatement(
-	    		"UPDATE seven_signs SET cabal=?, seal=?, red_stones=?, " +
-	    		"green_stones=?, blue_stones=?, ancient_adena_amount=?, contribution_score=? WHERE char_obj_id=?");
-	    	statement.setString(1, sevenDat.getString("cabal"));
-	    	statement.setInt(2, sevenDat.getInteger("seal"));
-	    	statement.setInt(3, sevenDat.getInteger("red_stones"));
-	    	statement.setInt(4, sevenDat.getInteger("green_stones"));
-	    	statement.setInt(5, sevenDat.getInteger("blue_stones"));
-	    	statement.setInt(6, sevenDat.getInteger("ancient_adena_amount"));
-	    	statement.setInt(7, sevenDat.getInteger("contribution_score"));
-	    	statement.setInt(8, sevenDat.getInteger("char_obj_id"));
-	    	statement.execute();
-			statement.close();	
-			
-			if (Config.DEBUG)
-				_log.info("SevenSigns: Updated data in DB for char ID " + sevenDat.getInteger("char_obj_id") + " (" + sevenDat.getString("cabal") + ")");
-	    }
-	    
-	    con.close();
-			
-	    if (updateSettings) {
-	    	Properties SevenSignsProp = new Properties();
-	    	FileOutputStream fos = new FileOutputStream(new File(Config.DATAPACK_ROOT, SEVEN_SIGNS_DATA_FILE));
-	    	
-	    	SevenSignsProp.setProperty("CurrentCycle", String.valueOf(_currentCycle));
-	    	SevenSignsProp.setProperty("Period", String.valueOf(_activePeriod));
-	    	SevenSignsProp.setProperty("PreviousWinner", String.valueOf(_previousWinner));
-			
-	    	SevenSignsProp.setProperty("DawnStoneScore", String.valueOf(_dawnStoneScore));
-			SevenSignsProp.setProperty("DuskStoneScore", String.valueOf(_duskStoneScore));
-			SevenSignsProp.setProperty("DawnFestivalScore", String.valueOf(_dawnFestivalScore));
-			SevenSignsProp.setProperty("DuskFestivalScore", String.valueOf(_duskFestivalScore));
-						
-			SevenSignsProp.setProperty("AvariceOwner", String.valueOf(_signsSealOwners.get(SEAL_AVARICE)));
-			SevenSignsProp.setProperty("GnosisOwner", String.valueOf(_signsSealOwners.get(SEAL_GNOSIS)));
-			SevenSignsProp.setProperty("StrifeOwner", String.valueOf(_signsSealOwners.get(SEAL_STRIFE)));
-			
-			SevenSignsProp.setProperty("AvariceDawnScore", String.valueOf(_signsDawnSealTotals.get(SEAL_AVARICE)));
-			SevenSignsProp.setProperty("GnosisDawnScore", String.valueOf(_signsDawnSealTotals.get(SEAL_GNOSIS)));
-			SevenSignsProp.setProperty("StrifeDawnScore", String.valueOf(_signsDawnSealTotals.get(SEAL_STRIFE)));
-			SevenSignsProp.setProperty("AvariceDuskScore", String.valueOf(_signsDuskSealTotals.get(SEAL_AVARICE)));
-			SevenSignsProp.setProperty("GnosisDuskScore", String.valueOf(_signsDuskSealTotals.get(SEAL_GNOSIS)));
-			SevenSignsProp.setProperty("StrifeDuskScore", String.valueOf(_signsDuskSealTotals.get(SEAL_STRIFE)));
-			
-            // Festival data is now saved along with the rest of the Seven Signs settings.
-			SevenSignsProp.setProperty("FestivalCycle", String.valueOf(SevenSignsFestival.getInstance().getCurrentFestivalCycle()));
-            
-            for (int i = 0; i < SevenSignsFestival.FESTIVAL_COUNT; i++) 
-                SevenSignsProp.setProperty("AccumulatedBonus_" + i, String.valueOf(SevenSignsFestival.getInstance().getAccumulatedBonus(i)));
-            
-			SevenSignsProp.store(fos, "Seven Signs Properties");
-			fos.close();
-            
-            if (Config.DEBUG)
-                _log.info("SevenSigns: Updated data in signs.properties file.");
-	    }
+		try
+		{
+			con = L2DatabaseFactory.getInstance().getConnection();
+				
+		    for (StatsSet sevenDat : _signsPlayerData.values())
+		    {
+		    	if (player != null)
+		    		if (sevenDat.getInteger("char_obj_id") != player.getObjectId())
+		    			continue;
+		    	
+		    	statement = con.prepareStatement(
+		    		"UPDATE seven_signs SET cabal=?, seal=?, dawn_red_stones=?, " +
+		    		"dawn_green_stones=?, dawn_blue_stones=?, " +
+		    		"dawn_ancient_adena_amount=?, dawn_contribution_score=?, " +
+		    		"dusk_red_stones=?, dusk_green_stones=?, dusk_blue_stones=?, " +
+		    		"dusk_ancient_adena_amount=?, dusk_contribution_score=? " + 
+		    		"WHERE char_obj_id=?");
+		    	statement.setString(1, sevenDat.getString("cabal"));
+		    	statement.setInt(2, sevenDat.getInteger("seal"));
+		    	statement.setInt(3, sevenDat.getInteger("dawn_red_stones"));
+		    	statement.setInt(4, sevenDat.getInteger("dawn_green_stones"));
+		    	statement.setInt(5, sevenDat.getInteger("dawn_blue_stones"));
+		    	statement.setInt(6, sevenDat.getInteger("dawn_ancient_adena_amount"));
+		    	statement.setInt(7, sevenDat.getInteger("dawn_contribution_score"));
+		    	statement.setInt(8, sevenDat.getInteger("dusk_red_stones"));
+		    	statement.setInt(9, sevenDat.getInteger("dusk_green_stones"));
+		    	statement.setInt(10, sevenDat.getInteger("dusk_blue_stones"));
+		    	statement.setInt(11, sevenDat.getInteger("dusk_ancient_adena_amount"));
+		    	statement.setInt(12, sevenDat.getInteger("dusk_contribution_score"));
+		    	statement.setInt(13, sevenDat.getInteger("char_obj_id"));
+		    	statement.execute();
+		    	
+		    	statement.close();
+		    	
+				if (Config.DEBUG)
+					_log.info("SevenSigns: Updated data in DB for char ID " + sevenDat.getInteger("char_obj_id") + " (" + sevenDat.getString("cabal") + ")");
+		    }
+        
+	        if(updateSettings) 
+	        {
+	            
+	            String query = "UPDATE seven_signs_status SET current_cycle=?, active_period=?, previous_winner=?, " +
+	               "dawn_stone_score=?, dawn_festival_score=?, dusk_stone_score=?, dusk_festival_score=?, " +
+	               "avarice_owner=?, gnosis_owner=?, strife_owner=?, avarice_dawn_score=?, gnosis_dawn_score=?, " +
+	               "strife_dawn_score=?, avarice_dusk_score=?, gnosis_dusk_score=?, strife_dusk_score=?, " +
+	               "festival_cycle=?, ";
+	            for(int i = 0; i < (SevenSignsFestival.FESTIVAL_COUNT); i++)
+	                query += "accumulated_bonus" + String.valueOf(i) + "=?, ";
+	            query += "date=?";
+	            
+	            statement = con.prepareStatement(query);
+	            
+	            statement.setInt(1, _currentCycle);
+	            statement.setInt(2, _activePeriod);
+	            statement.setInt(3, _previousWinner);
+	            statement.setInt(4, _dawnStoneScore);
+	            statement.setInt(5, _dawnFestivalScore);
+	            statement.setInt(6, _duskStoneScore);
+	            statement.setInt(7, _duskFestivalScore);
+	            statement.setInt(8, _signsSealOwners.get(SEAL_AVARICE));
+	            statement.setInt(9, _signsSealOwners.get(SEAL_GNOSIS));
+	            statement.setInt(10,_signsSealOwners.get(SEAL_STRIFE));
+	            statement.setInt(11,_signsDawnSealTotals.get(SEAL_AVARICE));
+	            statement.setInt(12,_signsDawnSealTotals.get(SEAL_GNOSIS));
+	            statement.setInt(13,_signsDawnSealTotals.get(SEAL_STRIFE));
+	            statement.setInt(14,_signsDuskSealTotals.get(SEAL_AVARICE));
+	            statement.setInt(15,_signsDuskSealTotals.get(SEAL_GNOSIS));
+	            statement.setInt(16,_signsDuskSealTotals.get(SEAL_STRIFE));
+	            
+	            statement.setInt(17,SevenSignsFestival.getInstance().getCurrentFestivalCycle());
+	            for(int i = 0; i < SevenSignsFestival.FESTIVAL_COUNT; i++)
+	                statement.setInt(18+i,SevenSignsFestival.getInstance().getAccumulatedBonus(i));
+	            statement.setInt(18 + SevenSignsFestival.FESTIVAL_COUNT,Calendar.getInstance().get(Calendar.DAY_OF_WEEK));
+	            statement.execute();
+	            
+	            if (Config.DEBUG)
+	                _log.info("SevenSigns: Updated data in SQL database.");
+	            
+	        }
+		}
+		catch (SQLException e)
+		{
+			_log.severe("Unable to save Seven Signs data: " + e);
+		}
+		finally
+		{
+    		try
+    		{
+	    		if (statement != null)
+	    			statement.close();
+	    		if (con != null)
+	    			con.close();
+    		}
+    		catch (SQLException e) {}
+		}
 	}
 	
     /**
@@ -941,11 +839,6 @@
      */
     protected void resetPlayerData()
 	{
-		String compWinner = "dawn";
-		
-		if (getCabalHighestScore() == CABAL_DUSK) 
-			compWinner = "dusk";	
-		
 		if (Config.DEBUG)
 			_log.info("SevenSigns: Resetting player data for new event period.");
 		
@@ -953,22 +846,48 @@
 		{
 			int charObjId = sevenDat.getInteger("char_obj_id");
 			
-			// Reset seal stones for the winning cabal
-			if (sevenDat.getString("cabal").equals(compWinner))
-			{ 
-				sevenDat.set("red_stones", 0);
-				sevenDat.set("green_stones", 0);
-				sevenDat.set("blue_stones", 0);
-				sevenDat.set("contribution_score", 0);
+			// Reset seal stones and contribution score for winning cabal
+			if (sevenDat.getString("cabal").equalsIgnoreCase(getCabalShortName(getCabalHighestScore())))
+			{
+				switch (getCabalHighestScore())
+				{
+					case CABAL_DAWN:
+						sevenDat.set("dawn_red_stones", 0);
+						sevenDat.set("dawn_green_stones", 0);
+						sevenDat.set("dawn_blue_stones", 0);
+						sevenDat.set("dawn_contribution_score", 0);
+						break;
+					case CABAL_DUSK:
+						sevenDat.set("dusk_red_stones", 0);
+						sevenDat.set("dusk_green_stones", 0);
+						sevenDat.set("dusk_blue_stones", 0);
+						sevenDat.set("dusk_contribution_score", 0);
+						break;
+				}
 			}
+			else
+			{
+				if (sevenDat.getString("cabal").equalsIgnoreCase("dawn") || sevenDat.getString("cabal").equalsIgnoreCase(""))
+				{
+					sevenDat.set("dusk_red_stones", 0);
+					sevenDat.set("dusk_green_stones", 0);
+					sevenDat.set("dusk_blue_stones", 0);
+					sevenDat.set("dusk_contribution_score", 0);
+				}
+				else if (sevenDat.getString("cabal").equalsIgnoreCase("dusk") || sevenDat.getString("cabal").equalsIgnoreCase(""))
+				{
+					sevenDat.set("dawn_red_stones", 0);
+					sevenDat.set("dawn_green_stones", 0);
+					sevenDat.set("dawn_blue_stones", 0);
+					sevenDat.set("dawn_contribution_score", 0);
+				}
+			}
 			
 			// Reset the player's cabal and seal information
 			sevenDat.set("cabal", "");
 			sevenDat.set("seal", SEAL_NULL);
-			_signsPlayerData.put(charObjId, sevenDat);
+			_signsPlayerData.put(charObjId, sevenDat);			
 		}
-        
-        // A database update should soon follow this!
 	}
 	
 	/**
@@ -997,66 +916,92 @@
 	public int setPlayerInfo(L2PcInstance player, int chosenCabal, int chosenSeal)
 	{
 		final int charObjId = player.getObjectId();
-				
-		if (hasRegisteredBefore(player)) {
-			final int oldCabal = getPlayerCabal(player);
-			
-			if (oldCabal == chosenCabal)
-				return oldCabal;
-
+		Connection con = null;
+		PreparedStatement statement = null;
+		StatsSet currPlayer = null;
+						
+		if (hasRegisteredBefore(player)) 
+		{
 			// If the seal validation period has passed, 
 			// cabal information was removed and so "re-register" player 
-			StatsSet currPlayer = _signsPlayerData.get(charObjId);
+			currPlayer = _signsPlayerData.get(charObjId);
 			currPlayer.set("cabal", getCabalShortName(chosenCabal));
 			currPlayer.set("seal", chosenSeal);
 			
-			_signsPlayerData.put(charObjId, currPlayer);
-            
-            try {
-                saveSevenSignsData(player, false);
-            }
-            catch (Exception e) {
-                _log.severe("SevenSigns: Failed to save configuration: " + e);
-            }
+			_signsPlayerData.put(charObjId, currPlayer);			
 		}
-		else {
-			StatsSet sevenDat = new StatsSet(); 
-			sevenDat.set("char_obj_id", charObjId);
-			sevenDat.set("cabal", getCabalShortName(chosenCabal));
-			sevenDat.set("seal", chosenSeal);
-			sevenDat.set("red_stones", 0);
-			sevenDat.set("green_stones", 0);
-			sevenDat.set("blue_stones", 0);
-			sevenDat.set("ancient_adena_amount", 0);
-			sevenDat.set("contribution_score", 0);
+		else 
+		{
+			currPlayer = new StatsSet(); 
+			currPlayer.set("char_obj_id", charObjId);
+			currPlayer.set("cabal", getCabalShortName(chosenCabal));
+			currPlayer.set("seal", chosenSeal);
+			currPlayer.set("dawn_red_stones", 0);
+			currPlayer.set("dawn_green_stones", 0);
+			currPlayer.set("dawn_blue_stones", 0);
+			currPlayer.set("dawn_ancient_adena_amount", 0);
+			currPlayer.set("dawn_contribution_score", 0);
+			currPlayer.set("dusk_red_stones", 0);
+			currPlayer.set("dusk_green_stones", 0);
+			currPlayer.set("dusk_blue_stones", 0);
+			currPlayer.set("dusk_ancient_adena_amount", 0);
+			currPlayer.set("dusk_contribution_score", 0);
 
-			_signsPlayerData.put(charObjId, sevenDat);
-			
+			_signsPlayerData.put(charObjId, currPlayer);
+
 			// Update data in database, as we have a new player signing up.
-			java.sql.Connection con = null;
-			
-			try {
+			try 
+			{
 				con = L2DatabaseFactory.getInstance().getConnection();
-				
-				PreparedStatement statement = con.prepareStatement(
-		    		"INSERT INTO seven_signs (char_obj_id, cabal, seal, red_stones, green_stones, blue_stones, " +
-					"ancient_adena_amount, contribution_score) VALUES (?,?,?,0,0,0,0,0)");
+				statement = con.prepareStatement(
+		    		"INSERT INTO seven_signs (char_obj_id, cabal, seal) VALUES (?,?,?)");
 				statement.setInt(1, charObjId);
 				statement.setString(2, getCabalShortName(chosenCabal));
 				statement.setInt(3, chosenSeal);
 				statement.execute();
-				statement.close();	
 				
-				con.close();
+				if (Config.DEBUG)
+					_log.info("SevenSigns: Inserted data in DB for char ID " + currPlayer.getInteger("char_obj_id") + " (" + currPlayer.getString("cabal") + ")");
 			}
-			catch (Exception e) {
+			catch (SQLException e) 
+			{
 				_log.severe("SevenSigns: Failed to save data: " + e);
 			}
-			
-			if (Config.DEBUG)
-				_log.info("SevenSigns: Inserted data in DB for char ID " + sevenDat.getInteger("char_obj_id") + " (" + sevenDat.getString("cabal") + ")");
+			finally
+			{
+	    		try
+	    		{
+		    		if (statement != null)
+		    			statement.close();
+		    		if (con != null)
+		    			con.close();
+	    		}
+	    		catch (SQLException e) {}
+			}
 		}
 		
+		int contribScore = 0;
+		
+		switch (chosenCabal)
+		{
+			case CABAL_DAWN:
+				contribScore = calcContributionScore(currPlayer.getInteger("dawn_blue_stones"), currPlayer.getInteger("dawn_green_stones"), currPlayer.getInteger("dawn_red_stones"));
+				_dawnStoneScore += contribScore;
+				break;
+			case CABAL_DUSK:
+				contribScore = calcContributionScore(currPlayer.getInteger("dusk_blue_stones"), currPlayer.getInteger("dusk_green_stones"), currPlayer.getInteger("dusk_red_stones"));
+				_duskStoneScore += contribScore;
+				break;
+		}
+
+		// Increasing Seal total score for the player chosen Seal.
+		if (currPlayer.getString("cabal") == "dawn")
+			_signsDawnSealTotals.put(chosenSeal, _signsDawnSealTotals.get(chosenSeal) + 1);
+		else
+			_signsDuskSealTotals.put(chosenSeal, _signsDuskSealTotals.get(chosenSeal) + 1);
+        
+        saveSevenSignsData(player, true);
+
 		if (Config.DEBUG) 
 			_log.info("SevenSigns: " + player.getName() + " has joined the " + getCabalName(chosenCabal) + " for the " + getSealName(chosenSeal, false) + "!");
 		
@@ -1077,24 +1022,28 @@
 		int charObjId = player.getObjectId();
 		StatsSet currPlayer = _signsPlayerData.get(charObjId);
 		
-		int rewardAmount = currPlayer.getInteger("ancient_adena_amount");
+		int rewardAmount = 0;
+		if (currPlayer.getString("cabal").equalsIgnoreCase("dawn"))
+		{
+			rewardAmount = currPlayer.getInteger("dawn_ancient_adena_amount");
+			currPlayer.set("dawn_ancient_adena_amount", 0);
+		}
+		else
+		{
+			rewardAmount = currPlayer.getInteger("dusk_ancient_adena_amount");
+			currPlayer.set("dusk_ancient_adena_amount", 0);
+		}
 		
-		if (removeReward) {
-			currPlayer.set("ancient_adena_amount", 0);
+		if (removeReward) 
+		{
 			_signsPlayerData.put(charObjId, currPlayer);
-            
-            try {
-                saveSevenSignsData(player, false);
-            }
-            catch (Exception e) {
-                _log.severe("Failed to save Seven Signs configuration: " + e);
-            }
+			saveSevenSignsData(player, true);
 		}
 		
 		return rewardAmount;
 	}
 	
-	/**
+    /**
      * Used to add the specified player's seal stone contribution points 
      * to the current total for their cabal. Returns the point score the 
      * contribution was worth.
@@ -1113,31 +1062,46 @@
 		StatsSet currPlayer = _signsPlayerData.get(charObjId);
 		
 		int contribScore = calcContributionScore(blueCount, greenCount, redCount);
-		int totalAncientAdena = currPlayer.getInteger("ancient_adena_amount") + calcAncientAdenaReward(blueCount, greenCount, redCount);
-		int totalContribScore = currPlayer.getInteger("contribution_score") + contribScore; 
+		int totalAncientAdena = 0;
+		int totalContribScore = 0;
 		
-		if (totalContribScore > MAXIMUM_PLAYER_CONTRIB)
-			return -1;
-		
-		currPlayer.set("red_stones", currPlayer.getInteger("red_stones") + redCount);
-		currPlayer.set("green_stones", currPlayer.getInteger("green_stones") + greenCount);
-		currPlayer.set("blue_stones", currPlayer.getInteger("blue_stones") + blueCount);
-		currPlayer.set("ancient_adena_amount", totalAncientAdena);
-		currPlayer.set("contribution_score", totalContribScore);
-		_signsPlayerData.put(charObjId, currPlayer);
-		
 		if (currPlayer.getString("cabal").equals("dawn")) 
+		{
+			totalAncientAdena = currPlayer.getInteger("dawn_ancient_adena_amount") + calcAncientAdenaReward(blueCount, greenCount, redCount);
+			totalContribScore = currPlayer.getInteger("dawn_contribution_score") + contribScore; 
+			
+			if (totalContribScore > MAXIMUM_PLAYER_CONTRIB)
+				return -1;
+			
+			currPlayer.set("dawn_red_stones", currPlayer.getInteger("dawn_red_stones") + redCount);
+			currPlayer.set("dawn_green_stones", currPlayer.getInteger("dawn_green_stones") + greenCount);
+			currPlayer.set("dawn_blue_stones", currPlayer.getInteger("dawn_blue_stones") + blueCount);
+			currPlayer.set("dawn_ancient_adena_amount", totalAncientAdena);
+			currPlayer.set("dawn_contribution_score", totalContribScore);
+			_signsPlayerData.put(charObjId, currPlayer);
+			
 			_dawnStoneScore += contribScore;
+		}
 		else
+		{
+			totalAncientAdena = currPlayer.getInteger("dusk_ancient_adena_amount") + calcAncientAdenaReward(blueCount, greenCount, redCount);
+			totalContribScore = currPlayer.getInteger("dusk_contribution_score") + contribScore;
+			
+			if (totalContribScore > MAXIMUM_PLAYER_CONTRIB)
+				return -1;
+			
+			currPlayer.set("dusk_red_stones", currPlayer.getInteger("dusk_red_stones") + redCount);
+			currPlayer.set("dusk_green_stones", currPlayer.getInteger("dusk_green_stones") + greenCount);
+			currPlayer.set("dusk_blue_stones", currPlayer.getInteger("dusk_blue_stones") + blueCount);
+			currPlayer.set("dusk_ancient_adena_amount", totalAncientAdena);
+			currPlayer.set("dusk_contribution_score", totalContribScore);
+			_signsPlayerData.put(charObjId, currPlayer);
+			
 			_duskStoneScore += contribScore;
-		
-		try {
-			saveSevenSignsData(player, true);
 		}
-		catch (Exception e) {
-			_log.severe("Failed to save Seven Signs configuration: " + e);
-		}
 		
+		saveSevenSignsData(player, true);
+		
 		if (Config.DEBUG)
 			_log.info("SevenSigns: " + player.getName() + " contributed " + contribScore + " seal stone points to their cabal.");
 		
@@ -1234,14 +1198,14 @@
      */
     protected void resetSeals()
 	{
-		_signsDawnSealTotals.put(SEAL_AVARICE, CABAL_NULL);
-		_signsDawnSealTotals.put(SEAL_GNOSIS, CABAL_NULL);
-		_signsDawnSealTotals.put(SEAL_STRIFE, CABAL_NULL);
-		_signsDuskSealTotals.put(SEAL_AVARICE, CABAL_NULL);
-		_signsDuskSealTotals.put(SEAL_GNOSIS, CABAL_NULL);
-		_signsDuskSealTotals.put(SEAL_STRIFE, CABAL_NULL);
+		_signsDawnSealTotals.put(SEAL_AVARICE, 0);
+		_signsDawnSealTotals.put(SEAL_GNOSIS, 0);
+		_signsDawnSealTotals.put(SEAL_STRIFE, 0);
+		_signsDuskSealTotals.put(SEAL_AVARICE, 0);
+		_signsDuskSealTotals.put(SEAL_GNOSIS, 0);
+		_signsDuskSealTotals.put(SEAL_STRIFE, 0);
 	}
-	
+    	
     /**
      * Calculates the ownership of the three Seals of the Seven Signs, 
      * based on various criterion.
@@ -1250,22 +1214,8 @@
      */
     protected void calcNewSealOwners()
 	{
-		for (StatsSet sevenDat : _signsPlayerData.values())
+		if (Config.DEBUG) 
 		{
-			int playerSeal = sevenDat.getInteger("seal");
-			
-			if (playerSeal == SEAL_NULL)
-				continue;
-			
-			if (sevenDat.getString("cabal").equals("dawn")) 
-				_signsDawnSealTotals.put(playerSeal, _signsDawnSealTotals.get(playerSeal) + 1);
-			else if (sevenDat.getString("cabal").equals("dusk"))
-				_signsDuskSealTotals.put(playerSeal, _signsDuskSealTotals.get(playerSeal) + 1);
-			else
-				continue;
-		}
-		
-		if (Config.DEBUG) {
 			_log.info("SevenSigns: (Avarice) Dawn = " + _signsDawnSealTotals.get(SEAL_AVARICE) + ", Dusk = " + _signsDuskSealTotals.get(SEAL_AVARICE));
 			_log.info("SevenSigns: (Gnosis) Dawn = " + _signsDawnSealTotals.get(SEAL_GNOSIS) + ", Dusk = " + _signsDuskSealTotals.get(SEAL_GNOSIS));
 			_log.info("SevenSigns: (Strife) Dawn = " + _signsDawnSealTotals.get(SEAL_STRIFE) + ", Dusk = " + _signsDuskSealTotals.get(SEAL_STRIFE));
@@ -1274,11 +1224,8 @@
 		for (Integer currSeal : _signsDawnSealTotals.keySet()) 
 		{
 			int prevSealOwner = _signsSealOwners.get(currSeal);
-			int newSealOwner;
+			int newSealOwner = CABAL_NULL;
 			
-			int winningCabalSealScore = 0;
-			int totalWinningCabalMembers = 0;
-			
 			/*
 			 * - If a Seal was already closed or owned by the opponent and the new winner wants
 			 *   to assume ownership of the Seal, 35% or more of the members of the Cabal must 
@@ -1288,58 +1235,122 @@
 			 *   that seal if 10% or more members have chosen it. If they want to possess a new Seal, 
 			 *   at least 35% of the members of the Cabal must have chosen the new Seal. 
 			 */
-			if (prevSealOwner != getCabalHighestScore())
+			
+			switch (prevSealOwner)
 			{
-				totalWinningCabalMembers = getTotalMembers(getCabalHighestScore());
-				
-				if (getCabalHighestScore() == CABAL_DAWN)
-					winningCabalSealScore = _signsDawnSealTotals.get(currSeal);
-				else
-					winningCabalSealScore = _signsDuskSealTotals.get(currSeal);
-					
-				if (winningCabalSealScore > Math.round((float)0.35 * totalWinningCabalMembers)) 
-					newSealOwner = getCabalHighestScore();
-				else 
-					newSealOwner = prevSealOwner;
+				case CABAL_NULL:
+					switch (getCabalHighestScore())
+					{
+						case CABAL_NULL:
+							if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)) && _signsDawnSealTotals.get(currSeal) > _signsDuskSealTotals.get(currSeal))
+								newSealOwner = CABAL_DAWN;
+							else if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)) && _signsDuskSealTotals.get(currSeal) > _signsDawnSealTotals.get(currSeal))
+								newSealOwner = CABAL_DUSK;
+							else
+								newSealOwner = prevSealOwner;
+							break;
+						case CABAL_DAWN:
+							if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = CABAL_DAWN;
+							else if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = CABAL_DUSK;
+							else
+								newSealOwner = prevSealOwner;
+							break;
+						case CABAL_DUSK:
+							if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = CABAL_DUSK;
+							else if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = CABAL_DAWN;
+							else
+								newSealOwner = prevSealOwner;
+							break;
+					}
+					break;
+				case CABAL_DAWN:
+					switch (getCabalHighestScore())
+					{
+						case CABAL_NULL:
+							if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = prevSealOwner;
+							else if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = CABAL_DUSK;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+						case CABAL_DAWN:
+							if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = prevSealOwner;
+							else if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = CABAL_DUSK;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+						case CABAL_DUSK:
+							if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = CABAL_DUSK;
+							else if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = prevSealOwner;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+					}
+					break;
+				case CABAL_DUSK:
+					switch (getCabalHighestScore())
+					{
+						case CABAL_NULL:
+							if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = prevSealOwner;
+							else if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = CABAL_DAWN;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+						case CABAL_DAWN:
+							if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = CABAL_DAWN;
+							else if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = prevSealOwner;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+						case CABAL_DUSK:
+							if (_signsDuskSealTotals.get(currSeal) >= Math.round(0.10 * getTotalMembers(CABAL_DUSK)))
+								newSealOwner = prevSealOwner;
+							else if (_signsDawnSealTotals.get(currSeal) >= Math.round(0.35 * getTotalMembers(CABAL_DAWN)))
+								newSealOwner = CABAL_DAWN;
+							else
+								newSealOwner = CABAL_NULL;
+							break;
+					}
+					break;
 			}
-			else
-			{
-				totalWinningCabalMembers = getTotalMembers(prevSealOwner);
-				
-				if (prevSealOwner == CABAL_DAWN)
-					winningCabalSealScore = _signsDawnSealTotals.get(currSeal);
-				else
-					winningCabalSealScore = _signsDuskSealTotals.get(currSeal);
-
-				if (winningCabalSealScore > Math.round((float)0.10 * totalWinningCabalMembers))
-					newSealOwner = prevSealOwner;
-				else
-					newSealOwner = CABAL_NULL;
-			}
 			
 			_signsSealOwners.put(currSeal, newSealOwner);
 			
 			// Alert all online players to new seal status.
-			switch (currSeal) {
-			case SEAL_AVARICE:
-				if (newSealOwner == CABAL_DAWN)
-					sendMessageToAll(1212);
-				if (newSealOwner == CABAL_DUSK)
-					sendMessageToAll(1215);
-				break;
-			case SEAL_GNOSIS:
-				if (newSealOwner == CABAL_DAWN)
-					sendMessageToAll(1213);
-				if (newSealOwner == CABAL_DUSK)
-					sendMessageToAll(1216);
-				break;
-			case SEAL_STRIFE:
-				if (newSealOwner == CABAL_DAWN)
-					sendMessageToAll(1214);
-				if (newSealOwner == CABAL_DUSK)
-					sendMessageToAll(1217);
-				break;
-			}
+			switch (currSeal) 
+			{
+				case SEAL_AVARICE:
+					if (newSealOwner == CABAL_DAWN)
+						sendMessageToAll(1212);
+					if (newSealOwner == CABAL_DUSK)
+						sendMessageToAll(1215);
+					break;
+				case SEAL_GNOSIS:
+					if (newSealOwner == CABAL_DAWN)
+						sendMessageToAll(1213);
+					if (newSealOwner == CABAL_DUSK)
+						sendMessageToAll(1216);
+					break;
+				case SEAL_STRIFE:
+					if (newSealOwner == CABAL_DAWN)
+						sendMessageToAll(1214);
+					if (newSealOwner == CABAL_DUSK)
+						sendMessageToAll(1217);
+					break;
+			}    	
 		}
 	}
 	
@@ -1349,14 +1360,18 @@
      * <BR><BR>
      * Should only ever called at the beginning of Seal Validation.
      */
-    private void teleLosingCabalFromDungeons()
+    private void teleLosingCabalFromDungeons(String compWinner)
     {
         for (L2PcInstance onlinePlayer : L2World.getInstance().getAllPlayers())
-            if (onlinePlayer.getZ() < -4700) 
+        {
+    		int charObjId = onlinePlayer.getObjectId();
+			StatsSet currPlayer = _signsPlayerData.get(charObjId);
+            if (onlinePlayer.getZ() < -4700 && !currPlayer.getString("cabal").equals(compWinner)) 
             {
                 onlinePlayer.teleToLocation(MapRegionTable.TeleportWhereType.Town);
                 onlinePlayer.sendMessage("You have been teleported to the nearest town due to the beginning of the Seal Validation period.");
             }
+        }
     }
     
 	/**
@@ -1374,8 +1389,10 @@
              */
             final int periodEnded = _activePeriod;
             _activePeriod++;
+            spawnSevenSignsNPC();
             
-	        switch (periodEnded) { 
+	        switch (periodEnded) 
+	        { 
 	            case PERIOD_COMP_RECRUITING: // Initialization
                     
                     // Start the Festival of Darkness cycle.
@@ -1394,7 +1411,6 @@
 	                // Schedule a stop of the festival engine.
 	                SevenSignsFestival.getInstance().getFestivalManagerSchedule().cancel(false);
 	                
-	                resetSeals();
                     calcNewSealOwners();
                     
                     if (compWinner == CABAL_DUSK)
@@ -1408,8 +1424,7 @@
                     
                     // Perform initial Seal Validation set up.
                     initializeSeals();
-                    spawnSevenSignsNPCs();
-                    teleLosingCabalFromDungeons();
+                    teleLosingCabalFromDungeons(getCabalShortName(getCabalHighestScore()));
                     
                     // Send message that Seal Validation has begun.
                     sendMessageToAll(1218);
@@ -1426,6 +1441,7 @@
 	                
 	                // Reset all data
 	                resetPlayerData();
+	                resetSeals();
 
                     // Reset all Festival-related data and remove any unused blood offerings.
                     // NOTE: A full update of Festival data in the database is also performed.
@@ -1437,18 +1453,12 @@
 	                _dawnFestivalScore = 0;
 	                _duskFestivalScore = 0;
 	                
-	                removeSevenSignsNPCs();				
 	                _currentCycle++;
 	                break;
 	        }
 	        
 	        // Make sure all Seven Signs data is saved for future use.
-	        try {
-	            saveSevenSignsData(null, true);
-	        }
-	        catch (Exception e) {
-	            _log.severe("SevenSigns: Failed to save configuration: " + e);
-	        }
+	        saveSevenSignsData(null, true);
 	        
 	        SignsSky ss = new SignsSky();
 	        
@@ -1463,4 +1473,4 @@
 	        ClientScheduler.getInstance().scheduleMed(sspc, getMilliToPeriodChange());
 	    }
 	}
-}
\ No newline at end of file
+}
Index: java/net/sf/l2j/gameserver/SevenSignsFestival.java
===================================================================
--- java/net/sf/l2j/gameserver/SevenSignsFestival.java	(revisione 1681)
+++ java/net/sf/l2j/gameserver/SevenSignsFestival.java	(copia locale)
@@ -1,13 +1,11 @@
 package net.sf.l2j.gameserver;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
+import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Random;
 import java.util.concurrent.ScheduledFuture;
 import java.util.logging.Logger;
@@ -391,8 +389,8 @@
          {-79273, 85539, -5151, -1, 12667},
          
          {-79297, 84054, -5151, -1, 12668},
-         {-79285, 84006, -5151, -1, 12660},
-         {-79260, 84040, -5151, -1, 12661},
+         {-79285, 84006, -5151, -1, 12670},
+         {-79260, 84040, -5151, -1, 12671},
          
          // Archers and Marksmen \\
          {-79945, 85171, -5151, -1, 12664},
@@ -813,12 +811,7 @@
 
         _festivalData = new FastMap<Integer, Map<Integer, StatsSet>>();
         
-        try {
-            restoreFestivalData();
-        }
-        catch (Exception e) {
-            _log.severe("SevenSignsFestival: Failed to load configuration: " + e);
-        }
+        restoreFestivalData();
         
         if (_signsInstance.isSealValidationPeriod()) { 
             _log.info("SevenSignsFestival: Initialization bypassed due to Seal Validation in effect.");
@@ -874,7 +867,7 @@
      */
     public static final int getMaxLevelForFestival(int festivalId)
     {
-        int maxLevel = 75;
+        int maxLevel = 78;
         
         switch (festivalId) {
             case SevenSignsFestival.FESTIVAL_LEVEL_MAX_31:
@@ -975,62 +968,89 @@
      * 
      * @throws Exception
      */
-    protected void restoreFestivalData() throws Exception
+    protected void restoreFestivalData()
     { 
+        Connection con = null;
+        PreparedStatement statement = null;
+        ResultSet rset = null;
+        
         if (Config.DEBUG)
             _log.info("SevenSignsFestival: Restoring festival data. Current SS Cycle: " + _signsCycle);
-        
-        java.sql.Connection con = L2DatabaseFactory.getInstance().getConnection();
-        
-        PreparedStatement statement = con.prepareStatement("SELECT festivalId, cabal, cycle, date, score, members " +
-            "FROM seven_signs_festival");
-        ResultSet rset = statement.executeQuery();
-            
-        while (rset.next())
+
+        try
         {
-            int festivalCycle = rset.getInt("cycle");
-            int festivalId = rset.getInt("festivalId");
-            String cabal = rset.getString("cabal");
-            
-            StatsSet festivalDat = new StatsSet(); 
-            festivalDat.set("festivalId", festivalId);
-            festivalDat.set("cabal", cabal);
-            festivalDat.set("cycle", festivalCycle);
-            festivalDat.set("date", rset.getString("date"));
-            festivalDat.set("score", rset.getInt("score"));
-            festivalDat.set("members", rset.getString("members"));
-
-            if (Config.DEBUG)
-                _log.info("SevenSignsFestival: Loaded data from DB for (Cycle = " + festivalCycle + ", Oracle = " + cabal + ", Festival = "+ getFestivalName(festivalId));
-            
-            if (cabal.equals("dawn"))
-                festivalId += FESTIVAL_COUNT;
-                
-            Map<Integer, StatsSet> tempData = _festivalData.get(festivalCycle);
-            
-            if (tempData == null)
-                tempData = new FastMap<Integer, StatsSet>();
-            
-            tempData.put(festivalId, festivalDat);
-            _festivalData.put(festivalCycle, tempData);
+	        con = L2DatabaseFactory.getInstance().getConnection();
+	        statement = con.prepareStatement("SELECT festivalId, cabal, cycle, date, score, members " +
+	            "FROM seven_signs_festival");
+	        rset = statement.executeQuery();
+	            
+	        while (rset.next())
+	        {
+	            int festivalCycle = rset.getInt("cycle");
+	            int festivalId = rset.getInt("festivalId");
+	            String cabal = rset.getString("cabal");
+	            
+	            StatsSet festivalDat = new StatsSet(); 
+	            festivalDat.set("festivalId", festivalId);
+	            festivalDat.set("cabal", cabal);
+	            festivalDat.set("cycle", festivalCycle);
+	            festivalDat.set("date", rset.getString("date"));
+	            festivalDat.set("score", rset.getInt("score"));
+	            festivalDat.set("members", rset.getString("members"));
+	
+	            if (Config.DEBUG)
+	                _log.info("SevenSignsFestival: Loaded data from DB for (Cycle = " + festivalCycle + ", Oracle = " + cabal + ", Festival = "+ getFestivalName(festivalId));
+	            
+	            if (cabal.equals("dawn"))
+	                festivalId += FESTIVAL_COUNT;
+	                
+	            Map<Integer, StatsSet> tempData = _festivalData.get(festivalCycle);
+	            
+	            if (tempData == null)
+	                tempData = new FastMap<Integer, StatsSet>();
+	            
+	            tempData.put(festivalId, festivalDat);
+	            _festivalData.put(festivalCycle, tempData);
+	        }
+	        
+	        rset.close();
+	        statement.close();
+	        
+	        String query = "SELECT festival_cycle, ";
+	        for(int i = 0; i < FESTIVAL_COUNT-1; i++)
+	            query += "accumulated_bonus" + String.valueOf(i) + ", ";
+	        query += "accumulated_bonus" + String.valueOf(FESTIVAL_COUNT -1) + " ";
+	        query += "FROM seven_signs_status";
+	        statement = con.prepareStatement(query);
+	        rset = statement.executeQuery();
+	        
+	        while(rset.next())
+	        {
+	            _festivalCycle = rset.getInt("festival_cycle");
+	            for(int i = 0; i < FESTIVAL_COUNT; i++)
+	                _accumulatedBonuses.add(i, rset.getInt("accumulated_bonus" + String.valueOf(i)));
+	        }
+	        
+	        if (Config.DEBUG)
+	            _log.info("SevenSignsFestival: Loaded data from SQL.");
         }
-            
-        rset.close();
-        statement.close();  
-        con.close();
-        
-        Properties festivalData = new Properties();
-        InputStream is =  new FileInputStream(new File("./" + FESTIVAL_DATA_FILE));  
-        festivalData.load(is);
-        is.close();
-        
-        _festivalCycle = Integer.parseInt(festivalData.getProperty("FestivalCycle", "1"));
-        
-        for (int i = 0; i < FESTIVAL_COUNT; i++) 
-            _accumulatedBonuses.add(i, Integer.parseInt(festivalData.getProperty("AccumulatedBonus_" + i, "0")));
-        
-        if (Config.DEBUG)
-            _log.info("SevenSignsFestival: Loaded data from signs.properties.");
+        catch (SQLException e)
+        {
+            _log.severe("SevenSignsFestival: Failed to load configuration: " + e);        	
+        }
+        finally
+        {
+        	try
+        	{
+	        	if (rset != null)
+	        		rset.close();
+	        	if (statement != null)
+	        		statement.close();
+	        	if (con != null)
+	        		con.close();
+        	}
+        	catch (SQLException e2) {}
+        }
      }
     
     /**
@@ -1040,62 +1060,82 @@
      * @param updateSettings
      * @throws Exception
      */
-    public synchronized void saveFestivalData(boolean updateSettings) throws Exception
+    public synchronized void saveFestivalData(boolean updateSettings)
     {
-        if (Config.DEBUG)
+    	Connection con = null;
+    	PreparedStatement statement = null;
+    	
+    	if (Config.DEBUG)
             System.out.println("SevenSignsFestival: Saving festival data to disk.");
 
-        java.sql.Connection con = L2DatabaseFactory.getInstance().getConnection();
-        
-        for (Map<Integer, StatsSet> currCycleData : _festivalData.values())
+        try
         {
-            for (StatsSet festivalDat : currCycleData.values())
-            {
-                int festivalCycle = festivalDat.getInteger("cycle");
-                int festivalId = festivalDat.getInteger("festivalId");
-                String cabal = festivalDat.getString("cabal");
-                
-                // Try to update an existing record.
-                PreparedStatement statement = con.prepareStatement(
-                    "UPDATE seven_signs_festival SET date=?, score=?, members=? WHERE cycle=? AND cabal=? AND festivalId=?");
-                statement.setLong(1, Long.valueOf(festivalDat.getString("date")));
-                statement.setInt(2, festivalDat.getInteger("score"));
-                statement.setString(3, festivalDat.getString("members"));
-                statement.setInt(4, festivalCycle);
-                statement.setString(5, cabal);
-                statement.setInt(6, festivalId);
-                
-                // If there was no record to update, assume it doesn't exist and add a new one,
-                // otherwise continue with the next record to store.
-                if (statement.executeUpdate() > 0) {
-                    if (Config.DEBUG)
-                        _log.info("SevenSignsFestival: Updated data in DB (Cycle = " + festivalCycle + ", Cabal = " + cabal + ", FestID = " + festivalId + ")");
-
-                    statement.close();
-                    continue;
-                }
-                    
-                statement = con.prepareStatement(
-                    "INSERT INTO seven_signs_festival (festivalId, cabal, cycle, date, score, members) VALUES (?,?,?,?,?,?)");
-                statement.setInt(1, festivalId);
-                statement.setString(2, cabal);                
-                statement.setInt(3, festivalCycle);
-                statement.setLong(4, Long.valueOf(festivalDat.getString("date")));
-                statement.setInt(5, festivalDat.getInteger("score"));
-                statement.setString(6, festivalDat.getString("members"));
-                statement.execute();
-                statement.close();
-                
-                if (Config.DEBUG)
-                    _log.info("SevenSignsFestival: Inserted data in DB (Cycle = " + festivalCycle + ", Cabal = " + cabal + ", FestID = " + festivalId + ")");
-            }
+        	con = L2DatabaseFactory.getInstance().getConnection();
+	        
+	        for (Map<Integer, StatsSet> currCycleData : _festivalData.values())
+	        {
+	            for (StatsSet festivalDat : currCycleData.values())
+	            {
+	                int festivalCycle = festivalDat.getInteger("cycle");
+	                int festivalId = festivalDat.getInteger("festivalId");
+	                String cabal = festivalDat.getString("cabal");
+	                
+	                // Try to update an existing record.
+	                statement = con.prepareStatement(
+	                    "UPDATE seven_signs_festival SET date=?, score=?, members=? WHERE cycle=? AND cabal=? AND festivalId=?");
+	                statement.setLong(1, Long.valueOf(festivalDat.getString("date")));
+	                statement.setInt(2, festivalDat.getInteger("score"));
+	                statement.setString(3, festivalDat.getString("members"));
+	                statement.setInt(4, festivalCycle);
+	                statement.setString(5, cabal);
+	                statement.setInt(6, festivalId);
+	                
+	                // If there was no record to update, assume it doesn't exist and add a new one,
+	                // otherwise continue with the next record to store.
+	                if (statement.executeUpdate() > 0) 
+	                {
+	                    if (Config.DEBUG)
+	                        _log.info("SevenSignsFestival: Updated data in DB (Cycle = " + festivalCycle + ", Cabal = " + cabal + ", FestID = " + festivalId + ")");
+	
+	                    continue;
+	                }
+	                
+	                statement.close();
+	                    
+	                statement = con.prepareStatement(
+	                    "INSERT INTO seven_signs_festival (festivalId, cabal, cycle, date, score, members) VALUES (?,?,?,?,?,?)");
+	                statement.setInt(1, festivalId);
+	                statement.setString(2, cabal);                
+	                statement.setInt(3, festivalCycle);
+	                statement.setLong(4, Long.valueOf(festivalDat.getString("date")));
+	                statement.setInt(5, festivalDat.getInteger("score"));
+	                statement.setString(6, festivalDat.getString("members"));
+	                statement.execute();
+	                
+	                if (Config.DEBUG)
+	                    _log.info("SevenSignsFestival: Inserted data in DB (Cycle = " + festivalCycle + ", Cabal = " + cabal + ", FestID = " + festivalId + ")");
+	            }
+	        }
+	            
+	        // Updates Seven Signs DB data also, so call only if really necessary.
+	        if (updateSettings)
+	            _signsInstance.saveSevenSignsData(null, true);
         }
-        
-        con.close();
-            
-        // Updates Seven Signs DB data also, so call only if really necessary.
-        if (updateSettings)
-            _signsInstance.saveSevenSignsData(null, true);
+        catch (SQLException e)
+        {
+        	_log.severe("SevenSignsFestival: Failed to save configuration: " + e);
+        }
+        finally
+        {
+        	try
+        	{
+	        	if (statement != null)
+	        		statement.close();
+	        	if (con != null)
+	        		con.close();
+        	}
+        	catch (SQLException e2) {}
+        }
     }
     
     /**
@@ -1148,12 +1188,7 @@
         // subsequently save it to the database.
         _festivalData.put(_signsCycle, newData);
         
-        try {
-            saveFestivalData(updateSettings);
-        }
-        catch (Exception e) {
-            _log.severe("SevenSignsFestival: Failed to save configuration: " + e);
-        }
+        saveFestivalData(updateSettings);
         
         // Remove any unused blood offerings from online players.
         for (L2PcInstance onlinePlayer : L2World.getInstance().getAllPlayers())
@@ -1357,15 +1392,17 @@
         // new blank data set and display a console warning.
         StatsSet currData = null;
         
-        try {
+        try 
+        {
             currData = _festivalData.get(_signsCycle).get(offsetId);
         }
-        catch (Exception e) {
+        catch (Exception e) 
+        {
             currData = new StatsSet();
             currData.set("score", 0);
             currData.set("members", "");
-        
-            _log.warning("SevenSignsFestival: Data missing for " + SevenSigns.getCabalName(oracle) + ", FestivalID = " + festivalId + " (Current Cycle " + _signsCycle + ")");
+            if (Config.DEBUG)
+            	_log.info("SevenSignsFestival: Data missing for " + SevenSigns.getCabalName(oracle) + ", FestivalID = " + festivalId + " (Current Cycle " + _signsCycle + ")");
         }
         
         return currData;
@@ -1474,12 +1511,7 @@
                     _log.info("SevenSignsFestival: This is the highest score overall so far for the " + getFestivalName(festivalId) + " festival!");
             }
             
-            try {
-                saveFestivalData(false);
-            }
-            catch (Exception e) {
-                _log.severe("SevenSignsFestival: Failed to save configuration data: " + e);
-            }
+            saveFestivalData(true);
             
             return true;
         }
@@ -2205,4 +2237,4 @@
                 _npcId = -1;
         }
     }
-}
\ No newline at end of file
+}