Procházet zdrojové kódy

SevenSigns storage rework.
Save SS data not by one massive periodic update, but during periodic character's storing.
Also use objectId instead of player instance.
Require DP update !

_DS_ před 15 roky
rodič
revize
9b8adb9ac2
18 změnil soubory, kde provedl 251 přidání a 211 odebrání
  1. 2 0
      L2_GameServer/java/com/l2jserver/Config.java
  2. 203 148
      L2_GameServer/java/com/l2jserver/gameserver/SevenSigns.java
  3. 3 23
      L2_GameServer/java/com/l2jserver/gameserver/SevenSignsFestival.java
  4. 2 1
      L2_GameServer/java/com/l2jserver/gameserver/Shutdown.java
  5. 2 7
      L2_GameServer/java/com/l2jserver/gameserver/model/AutoChatHandler.java
  6. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Npc.java
  7. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2CabaleBufferInstance.java
  8. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2CastleMagicianInstance.java
  9. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DawnPriestInstance.java
  10. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DungeonGatekeeperInstance.java
  11. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DuskPriestInstance.java
  12. 4 3
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  13. 10 10
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2SignsPriestInstance.java
  14. 3 2
      L2_GameServer/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
  15. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/clientpackets/RequestSSQStatus.java
  16. 7 8
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/SSQStatus.java
  17. 2 2
      L2_GameServer/java/com/l2jserver/gameserver/taskmanager/tasks/TaskSevenSignsUpdate.java
  18. 6 0
      L2_GameServer/java/config/Feature.properties

+ 2 - 0
L2_GameServer/java/com/l2jserver/Config.java

@@ -800,6 +800,7 @@ public final class Config
 	public static double ALT_SIEGE_DAWN_GATES_MDEF_MULT;
 	public static double ALT_SIEGE_DUSK_GATES_MDEF_MULT;
 	public static boolean ALT_STRICT_SEVENSIGNS;
+	public static boolean ALT_SEVENSIGNS_LAZY_UPDATE;
 
 
 	//--------------------------------------------------
@@ -1238,6 +1239,7 @@ public final class Config
 					ALT_SIEGE_DAWN_GATES_MDEF_MULT = Double.parseDouble(Feature.getProperty("AltDawnGatesMdefMult", "1.1"));
 					ALT_SIEGE_DUSK_GATES_MDEF_MULT = Double.parseDouble(Feature.getProperty("AltDuskGatesMdefMult", "0.8"));
 					ALT_STRICT_SEVENSIGNS = Boolean.parseBoolean(Feature.getProperty("StrictSevenSigns", "True"));
+					ALT_SEVENSIGNS_LAZY_UPDATE = Boolean.parseBoolean(Feature.getProperty("AltSevenSignsLazyUpdate", "True"));
 
 					TAKE_FORT_POINTS = Integer.parseInt(Feature.getProperty("TakeFortPoints", "200"));
 					LOOSE_FORT_POINTS = Integer.parseInt(Feature.getProperty("LooseFortPoints", "0"));

+ 203 - 148
L2_GameServer/java/com/l2jserver/gameserver/SevenSigns.java

@@ -145,7 +145,28 @@ public class SevenSigns
 	private static Map<Integer, AutoSpawnInstance> _oratorSpawns;
 	private static Map<Integer, AutoSpawnInstance> _preacherSpawns;
 	private static Map<Integer, AutoSpawnInstance> _marketeerSpawns;
-	
+
+	private static final String LOAD_DATA =
+		"SELECT charId, cabal, seal, red_stones, green_stones, blue_stones, " +
+		"ancient_adena_amount, contribution_score FROM seven_signs";
+
+	private static final String LOAD_STATUS = "SELECT * FROM seven_signs_status WHERE id=0";
+
+	private static final String INSERT_PLAYER =
+		"INSERT INTO seven_signs (charId, cabal, seal) VALUES (?,?,?)";
+
+	private static final String UPDATE_PLAYER = 
+		"UPDATE seven_signs SET cabal=?, seal=?, red_stones=?, green_stones=?, blue_stones=?, " +
+		"ancient_adena_amount=?, contribution_score=? WHERE charId=?";
+
+	private static final String UPDATE_STATUS =
+		"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=?, accumulated_bonus0=?, accumulated_bonus1=?, accumulated_bonus2=?," +
+		"accumulated_bonus3=?, accumulated_bonus4=?, date=? WHERE id=0";
+
 	private SevenSigns()
 	{
 		_signsPlayerData = new FastMap<Integer, StatsSet>();
@@ -652,63 +673,54 @@ public class SevenSigns
 		return cabalMembers;
 	}
 	
-	public final StatsSet getPlayerData(L2PcInstance player)
+	public int getPlayerStoneContrib(int objectId)
 	{
-		if (!hasRegisteredBefore(player))
-			return null;
-		
-		return _signsPlayerData.get(player.getObjectId());
-	}
-	
-	public int getPlayerStoneContrib(L2PcInstance player)
-	{
-		if (!hasRegisteredBefore(player))
+		final StatsSet currPlayer = _signsPlayerData.get(objectId);
+		if (currPlayer == null)
 			return 0;
-		
+
 		int stoneCount = 0;
-		
-		StatsSet currPlayer = getPlayerData(player);
-		
 		stoneCount += currPlayer.getInteger("red_stones");
 		stoneCount += currPlayer.getInteger("green_stones");
 		stoneCount += currPlayer.getInteger("blue_stones");
-		
+
 		return stoneCount;
 	}
 	
-	public int getPlayerContribScore(L2PcInstance player)
+	public int getPlayerContribScore(int objectId)
 	{
-		if (!hasRegisteredBefore(player))
+		final StatsSet currPlayer = _signsPlayerData.get(objectId);
+		if (currPlayer == null)
 			return 0;
-		
-		StatsSet currPlayer = getPlayerData(player);
-		
+
 		return currPlayer.getInteger("contribution_score");
 	}
 	
-	public int getPlayerAdenaCollect(L2PcInstance player)
+	public int getPlayerAdenaCollect(int objectId)
 	{
-		if (!hasRegisteredBefore(player))
+		final StatsSet currPlayer = _signsPlayerData.get(objectId);
+		if (currPlayer == null)
 			return 0;
-		
-		return _signsPlayerData.get(player.getObjectId()).getInteger("ancient_adena_amount");
+
+		return currPlayer.getInteger("ancient_adena_amount");
 	}
 	
-	public int getPlayerSeal(L2PcInstance player)
+	public int getPlayerSeal(int objectId)
 	{
-		if (!hasRegisteredBefore(player))
+		final StatsSet currPlayer = _signsPlayerData.get(objectId);
+		if (currPlayer == null)
 			return SEAL_NULL;
-		
-		return getPlayerData(player).getInteger("seal");
+
+		return currPlayer.getInteger("seal");
 	}
 	
-	public int getPlayerCabal(L2PcInstance player)
+	public int getPlayerCabal(int objectId)
 	{
-		if (!hasRegisteredBefore(player))
+		final StatsSet currPlayer = _signsPlayerData.get(objectId);
+		if (currPlayer == null)
 			return CABAL_NULL;
-		
-		String playerCabal = getPlayerData(player).getString("cabal");
-		
+
+		String playerCabal = currPlayer.getString("cabal");
 		if (playerCabal.equalsIgnoreCase("dawn"))
 			return CABAL_DAWN;
 		else if (playerCabal.equalsIgnoreCase("dusk"))
@@ -731,8 +743,7 @@ public class SevenSigns
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
-			statement = con.prepareStatement("SELECT charId, cabal, seal, red_stones, green_stones, blue_stones, "
-					+ "ancient_adena_amount, contribution_score FROM seven_signs");
+			statement = con.prepareStatement(LOAD_DATA);
 			rset = statement.executeQuery();
 			
 			StatsSet sevenDat = null;
@@ -761,7 +772,7 @@ public class SevenSigns
 			rset.close();
 			statement.close();
 			
-			statement = con.prepareStatement("SELECT * FROM seven_signs_status WHERE id=0");
+			statement = con.prepareStatement(LOAD_STATUS);
 			rset = statement.executeQuery();
 			
 			while (rset.next())
@@ -788,10 +799,6 @@ public class SevenSigns
 				
 				_lastSave.setTimeInMillis(rset.getLong("date"));
 			}
-			
-			rset.close();
-			statement.close();
-			con.close();
 		}
 		catch (SQLException e)
 		{
@@ -801,30 +808,29 @@ public class SevenSigns
 		{
 			try
 			{
-				rset.close();
 				statement.close();
-				con.close();
 			}
-			catch (Exception e)
+			catch (Exception e) {}
+			try
 			{
+				con.close();
 			}
+			catch (Exception e) {}
 		}
 		
 		// Festival data is loaded now after the Seven Signs engine data.
 	}
 	
 	/**
-	 * Saves all Seven Signs data, both to the database and properties file (if updateSettings = True).
-	 * Often called to preserve data integrity and synchronization with DB, in case of errors.
+	 * Saves all Seven Signs player data.
+	 * Should be called on period change and shutdown only.
 	 * <BR>
-	 * If player != null, just that player's data is updated in the database, otherwise all player's data is
-	 * sequentially updated.
 	 *
 	 * @param player
 	 * @param updateSettings
 	 * @throws Exception
 	 */
-	public void saveSevenSignsData(L2PcInstance player, boolean updateSettings)
+	public void saveSevenSignsData()
 	{
 		Connection con = null;
 		PreparedStatement statement = null;
@@ -835,15 +841,10 @@ public class SevenSigns
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
-			
+			statement = con.prepareStatement(UPDATE_PLAYER);
+
 			for (StatsSet sevenDat : _signsPlayerData.values())
 			{
-				if (player != null)
-					if (sevenDat.getInteger("charId") != player.getObjectId())
-						continue;
-				
-				statement = con.prepareStatement("UPDATE seven_signs SET cabal=?, seal=?, red_stones=?, "
-						+ "green_stones=?, blue_stones=?, " + "ancient_adena_amount=?, contribution_score=? " + "WHERE charId=?");
 				statement.setString(1, sevenDat.getString("cabal"));
 				statement.setInt(2, sevenDat.getInteger("seal"));
 				statement.setInt(3, sevenDat.getInteger("red_stones"));
@@ -854,57 +855,51 @@ public class SevenSigns
 				statement.setInt(8, sevenDat.getInteger("charId"));
 				statement.execute();
 				
-				statement.close();
-				
 				if (Config.DEBUG)
 					_log.info("SevenSigns: Updated data in database for char ID " + sevenDat.getInteger("charId") + " (" + sevenDat.getString("cabal") + ")");
 			}
-			
-			if (updateSettings)
+		}
+		catch (SQLException e)
+		{
+			_log.severe("SevenSigns: Unable to save data to database: " + e);
+		}
+		finally
+		{
+			try
 			{
-				String sqlQuery = "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++)
-					sqlQuery += "accumulated_bonus" + String.valueOf(i) + "=?, ";
-				
-				sqlQuery += "date=? WHERE id=0";
-				
-				statement = con.prepareStatement(sqlQuery);
-				statement.setInt(1, _currentCycle);
-				statement.setInt(2, _activePeriod);
-				statement.setInt(3, _previousWinner);
-				statement.setDouble(4, _dawnStoneScore);
-				statement.setInt(5, _dawnFestivalScore);
-				statement.setDouble(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));
-				
-				_lastSave = Calendar.getInstance();
-				statement.setLong(18 + SevenSignsFestival.FESTIVAL_COUNT, _lastSave.getTimeInMillis());
-				statement.execute();
-				
 				statement.close();
+			}
+			catch (Exception e) {}
+			try
+			{
 				con.close();
-				
-				if (Config.DEBUG)
-					_log.info("SevenSigns: Updated data in database.");
-				
 			}
+			catch (Exception e) {}
+		}
+	}
+
+	public final void saveSevenSignsData(int objectId)
+	{
+		StatsSet sevenDat = _signsPlayerData.get(objectId);
+		if (sevenDat == null)
+			return;
+
+		Connection con = null;
+		PreparedStatement statement = null;
+		try
+		{
+			con = L2DatabaseFactory.getInstance().getConnection();
+
+			statement = con.prepareStatement(UPDATE_PLAYER);
+			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.setDouble(6, sevenDat.getDouble("ancient_adena_amount"));
+			statement.setDouble(7, sevenDat.getDouble("contribution_score"));
+			statement.setInt(8, sevenDat.getInteger("charId"));
+			statement.execute();
 		}
 		catch (SQLException e)
 		{
@@ -915,14 +910,72 @@ public class SevenSigns
 			try
 			{
 				statement.close();
+			}
+			catch (Exception e) {}
+			try
+			{
 				con.close();
 			}
-			catch (Exception e)
+			catch (Exception e) {}
+		}
+	}
+
+	public final void saveSevenSignsStatus()
+	{
+		Connection con = null;
+		PreparedStatement statement = null;
+		try
+		{
+			con = L2DatabaseFactory.getInstance().getConnection();
+
+			statement = con.prepareStatement(UPDATE_STATUS);
+			statement.setInt(1, _currentCycle);
+			statement.setInt(2, _activePeriod);
+			statement.setInt(3, _previousWinner);
+			statement.setDouble(4, _dawnStoneScore);
+			statement.setInt(5, _dawnFestivalScore);
+			statement.setDouble(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));
+
+			_lastSave = Calendar.getInstance();
+			statement.setLong(18 + SevenSignsFestival.FESTIVAL_COUNT, _lastSave.getTimeInMillis());
+			statement.execute();
+
+			if (Config.DEBUG)
+				_log.info("SevenSigns: Updated data in database.");				
+		}
+		catch (SQLException e)
+		{
+			_log.severe("SevenSigns: Unable to save data to database: " + e);
+		}
+		finally
+		{
+			try
 			{
+				statement.close();
 			}
+			catch (Exception e) {}
+			try
+			{
+				con.close();
+			}
+			catch (Exception e) {}
 		}
 	}
-	
+
 	/**
 	 * Used to reset the cabal details of all players, and update the database.<BR>
 	 * Primarily used when beginning a new cycle, and should otherwise never be called.
@@ -948,17 +1001,6 @@ public class SevenSigns
 		}
 	}
 	
-	/**
-	 * Tests whether the specified player has joined a cabal in the past.
-	 *
-	 * @param player
-	 * @return boolean hasRegistered
-	 */
-	private boolean hasRegisteredBefore(L2PcInstance player)
-	{
-		return _signsPlayerData.containsKey(player.getObjectId());
-	}
-	
 	/**
 	 * Used to specify cabal-related details for the specified player. This method
 	 * checks to see if the player has registered before and will update the database
@@ -971,12 +1013,11 @@ public class SevenSigns
 	 * @param chosenSeal
 	 * @return int cabal
 	 */
-	public int setPlayerInfo(L2PcInstance player, int chosenCabal, int chosenSeal)
+	public int setPlayerInfo(int objectId, int chosenCabal, int chosenSeal)
 	{
-		int charObjId = player.getObjectId();
 		Connection con = null;
 		PreparedStatement statement = null;
-		StatsSet currPlayerData = getPlayerData(player);
+		StatsSet currPlayerData = _signsPlayerData.get(objectId);
 		
 		if (currPlayerData != null)
 		{
@@ -985,12 +1026,12 @@ public class SevenSigns
 			currPlayerData.set("cabal", getCabalShortName(chosenCabal));
 			currPlayerData.set("seal", chosenSeal);
 			
-			_signsPlayerData.put(charObjId, currPlayerData);
+			_signsPlayerData.put(objectId, currPlayerData);
 		}
 		else
 		{
 			currPlayerData = new StatsSet();
-			currPlayerData.set("charId", charObjId);
+			currPlayerData.set("charId", objectId);
 			currPlayerData.set("cabal", getCabalShortName(chosenCabal));
 			currPlayerData.set("seal", chosenSeal);
 			currPlayerData.set("red_stones", 0);
@@ -999,14 +1040,14 @@ public class SevenSigns
 			currPlayerData.set("ancient_adena_amount", 0);
 			currPlayerData.set("contribution_score", 0);
 			
-			_signsPlayerData.put(charObjId, currPlayerData);
+			_signsPlayerData.put(objectId, currPlayerData);
 			
 			// Update data in database, as we have a new player signing up.
 			try
 			{
 				con = L2DatabaseFactory.getInstance().getConnection();
-				statement = con.prepareStatement("INSERT INTO seven_signs (charId, cabal, seal) VALUES (?,?,?)");
-				statement.setInt(1, charObjId);
+				statement = con.prepareStatement(INSERT_PLAYER);
+				statement.setInt(1, objectId);
 				statement.setString(2, getCabalShortName(chosenCabal));
 				statement.setInt(3, chosenSeal);
 				statement.execute();
@@ -1040,12 +1081,9 @@ public class SevenSigns
 			_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) + "!");
+
+		if (!Config.ALT_SEVENSIGNS_LAZY_UPDATE)
+			saveSevenSignsStatus();
 		
 		return chosenCabal;
 	}
@@ -1059,9 +1097,9 @@ public class SevenSigns
 	 * @param removeReward
 	 * @return int rewardAmount
 	 */
-	public int getAncientAdenaReward(L2PcInstance player, boolean removeReward)
+	public int getAncientAdenaReward(int objectId, boolean removeReward)
 	{
-		StatsSet currPlayer = getPlayerData(player);
+		StatsSet currPlayer = _signsPlayerData.get(objectId);
 		int rewardAmount = currPlayer.getInteger("ancient_adena_amount");
 		
 		currPlayer.set("red_stones", 0);
@@ -1071,8 +1109,12 @@ public class SevenSigns
 		
 		if (removeReward)
 		{
-			_signsPlayerData.put(player.getObjectId(), currPlayer);
-			saveSevenSignsData(player, true);
+			_signsPlayerData.put(objectId, currPlayer);
+			if (!Config.ALT_SEVENSIGNS_LAZY_UPDATE)
+			{
+				saveSevenSignsData(objectId);
+				saveSevenSignsStatus();
+			}
 		}
 		
 		return rewardAmount;
@@ -1091,10 +1133,10 @@ public class SevenSigns
 	 * @param redCount
 	 * @return int contribScore
 	 */
-	public long addPlayerStoneContrib(L2PcInstance player, long blueCount, long greenCount, long redCount)
+	public long addPlayerStoneContrib(int objectId, long blueCount, long greenCount, long redCount)
 	{
-		StatsSet currPlayer = getPlayerData(player);
-		
+		StatsSet currPlayer = _signsPlayerData.get(objectId);
+
 		long contribScore = calcContributionScore(blueCount, greenCount, redCount);
 		long totalAncientAdena = currPlayer.getLong("ancient_adena_amount") + calcAncientAdenaReward(blueCount, greenCount, redCount);
 		long totalContribScore = currPlayer.getLong("contribution_score") + contribScore;
@@ -1107,9 +1149,9 @@ public class SevenSigns
 		currPlayer.set("blue_stones", currPlayer.getInteger("blue_stones") + blueCount);
 		currPlayer.set("ancient_adena_amount", totalAncientAdena);
 		currPlayer.set("contribution_score", totalContribScore);
-		_signsPlayerData.put(player.getObjectId(), currPlayer);
+		_signsPlayerData.put(objectId, currPlayer);
 		
-		switch (getPlayerCabal(player))
+		switch (getPlayerCabal(objectId))
 		{
 			case CABAL_DAWN:
 				_dawnStoneScore += contribScore;
@@ -1118,12 +1160,13 @@ public class SevenSigns
 				_duskStoneScore += contribScore;
 				break;
 		}
-		
-		saveSevenSignsData(player, true);
-		
-		if (Config.DEBUG)
-			_log.info("SevenSigns: " + player.getName() + " contributed " + contribScore + " seal stone points to their cabal.");
-		
+
+		if (!Config.ALT_SEVENSIGNS_LAZY_UPDATE)
+		{
+			saveSevenSignsData(objectId);
+			saveSevenSignsStatus();
+		}
+
 		return contribScore;
 	}
 	
@@ -1381,8 +1424,11 @@ public class SevenSigns
 			StatsSet currPlayer;
 			for (L2PcInstance onlinePlayer : pls)
 			{
-				currPlayer = getPlayerData(onlinePlayer);
-				
+				if (onlinePlayer == null)
+					continue;
+
+				currPlayer = _signsPlayerData.get(onlinePlayer.getObjectId());
+
 				if (isSealValidationPeriod() || isCompResultsPeriod())
 				{
 					if (!onlinePlayer.isGM() && onlinePlayer.isIn7sDungeon() && !currPlayer.getString("cabal").equals(compWinner))
@@ -1499,7 +1545,8 @@ public class SevenSigns
 			}
 			
 			// Make sure all Seven Signs data is saved for future use.
-			saveSevenSignsData(null, true);
+			saveSevenSignsData();
+			saveSevenSignsStatus();
 			
 			teleLosingCabalFromDungeons(getCabalShortName(getCabalHighestScore()));
 			
@@ -1562,11 +1609,16 @@ public class SevenSigns
 	
 	public void giveCPMult(int StrifeOwner)
 	{
+		int cabal;
 		//Gives "Victor of War" passive skill to all online characters with Cabal, which controls Seal of Strife 
 		for (L2PcInstance character : L2World.getInstance().getAllPlayers().values())
 		{
-			if (getPlayerCabal(character) != SevenSigns.CABAL_NULL)
-				if (getPlayerCabal(character) == StrifeOwner)
+			if (character == null)
+				continue;
+
+			cabal = getPlayerCabal(character.getObjectId());
+			if (cabal != SevenSigns.CABAL_NULL)
+				if (cabal == StrifeOwner)
 					character.addSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
 				else
 					//Gives "The Vanquished of War" passive skill to all online characters with Cabal, which does not control Seal of Strife
@@ -1578,6 +1630,9 @@ public class SevenSigns
 	{
 		for (L2PcInstance character : L2World.getInstance().getAllPlayers().values())
 		{
+			if (character == null)
+				continue;
+
 			//Remove SevenSigns' buffs/debuffs.
 			character.removeSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
 			character.removeSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());
@@ -1591,7 +1646,7 @@ public class SevenSigns
 		//Golems cannot be summoned by Dusk when the Seal of Strife is controlled by the Dawn
 		if (isSealValidationPeriod())
 			if (getSealOwner(SEAL_STRIFE) == CABAL_DAWN)
-				if (getPlayerCabal(activeChar) == CABAL_DUSK)
+				if (getPlayerCabal(activeChar.getObjectId()) == CABAL_DUSK)
 				{
 					activeChar.sendMessage("You cannot summon Siege Golem or Cannon while Seal of Strife posessed by Lords of Dawn.");
 					return true;

+ 3 - 23
L2_GameServer/java/com/l2jserver/gameserver/SevenSignsFestival.java

@@ -96,7 +96,7 @@ public class SevenSignsFestival implements SpawnListener
 	private static final int FESTIVAL_MAX_OFFSET_Y = 230;
 	private static final int FESTIVAL_DEFAULT_RESPAWN = 60; // Specify in seconds!
 	
-	public static final int FESTIVAL_COUNT = 5;
+	public static final int FESTIVAL_COUNT = 5; // do not change without correcting db and SevenSigns itself !
 	public static final int FESTIVAL_LEVEL_MAX_31 = 0;
 	public static final int FESTIVAL_LEVEL_MAX_42 = 1;
 	public static final int FESTIVAL_LEVEL_MAX_53 = 2;
@@ -1090,7 +1090,7 @@ public class SevenSignsFestival implements SpawnListener
 			
 			// Updates Seven Signs DB data also, so call only if really necessary.
 			if (updateSettings)
-				SevenSigns.getInstance().saveSevenSignsData(null, true);
+				SevenSigns.getInstance().saveSevenSignsStatus();
 		}
 		catch (SQLException e)
 		{
@@ -1691,7 +1691,7 @@ public class SevenSignsFestival implements SpawnListener
 	{
 		int playerBonus = 0;
 		String playerName = player.getName();
-		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 		
 		if (playerCabal != SevenSigns.getInstance().getCabalHighestScore())
 			return 0;
@@ -2037,16 +2037,6 @@ public class SevenSignsFestival implements SpawnListener
 			festivalId += (oracle == SevenSigns.CABAL_DUSK) ? 10 : 20;
 			return _festivalInstances.get(festivalId);
 		}
-		
-		/**
-		 * Returns the number of currently running festivals <b>WITH</b> participants.
-		 *
-		 * @return int Count
-		 */
-		public final int getInstanceCount()
-		{
-			return _festivalInstances.size();
-		}
 	}
 	
 	/**
@@ -2248,16 +2238,6 @@ public class SevenSignsFestival implements SpawnListener
 			}
 		}
 		
-		public void setSpawnRate(int respawnDelay)
-		{
-			if (Config.DEBUG)
-				_log.info("SevenSignsFestival: Modifying spawn rate of festival mobs to " + respawnDelay + " ms for festival "
-						+ SevenSigns.getCabalShortName(_cabal) + " (" + getFestivalName(_levelRange) + ")");
-			
-			for (L2FestivalMonsterInstance monsterInst : _npcInsts)
-				monsterInst.getSpawn().setRespawnDelay(respawnDelay);
-		}
-		
 		/**
 		 * Used to spawn monsters unique to the festival.
 		 * <BR>

+ 2 - 1
L2_GameServer/java/com/l2jserver/gameserver/Shutdown.java

@@ -504,7 +504,8 @@ public class Shutdown extends Thread
 			SevenSignsFestival.getInstance().saveFestivalData(false);
 		
 		// Save Seven Signs data before closing. :)
-		SevenSigns.getInstance().saveSevenSignsData(null, true);
+		SevenSigns.getInstance().saveSevenSignsData();
+		SevenSigns.getInstance().saveSevenSignsStatus();
 		
 		// Save all raidboss and GrandBoss status ^_^
 		RaidBossSpawnManager.getInstance().cleanUp();

+ 2 - 7
L2_GameServer/java/com/l2jserver/gameserver/model/AutoChatHandler.java

@@ -617,11 +617,6 @@ public class AutoChatHandler implements SpawnListener
 					setActive(true);
 			}
 			
-			protected AutoChatDefinition(AutoChatInstance chatInst, L2Npc npcInst)
-			{
-				this(chatInst, npcInst, null, -1);
-			}
-			
 			protected String[] getChatTexts()
 			{
 				if (_chatTexts != null)
@@ -792,7 +787,7 @@ public class AutoChatHandler implements SpawnListener
 							{
 								for (L2PcInstance nearbyPlayer : nearbyPlayers)
 								{
-									if (SevenSigns.getInstance().getPlayerCabal(nearbyPlayer) == winningCabal)
+									if (SevenSigns.getInstance().getPlayerCabal(nearbyPlayer.getObjectId()) == winningCabal)
 									{
 										text = text.replaceAll("%player_cabal_winner%", nearbyPlayer.getName());
 										break;
@@ -804,7 +799,7 @@ public class AutoChatHandler implements SpawnListener
 							{
 								for (L2PcInstance nearbyPlayer : nearbyPlayers)
 								{
-									if (SevenSigns.getInstance().getPlayerCabal(nearbyPlayer) == losingCabal)
+									if (SevenSigns.getInstance().getPlayerCabal(nearbyPlayer.getObjectId()) == losingCabal)
 									{
 										text = text.replaceAll("%player_cabal_loser%", nearbyPlayer.getName());
 										break;

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -1149,7 +1149,7 @@ public class L2Npc extends L2Character
 		String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH;
 		int sealAvariceOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_AVARICE);
 		int sealGnosisOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_GNOSIS);
-		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 		int compWinner = SevenSigns.getInstance().getCabalHighestScore();
 
 		switch (npcId)

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2CabaleBufferInstance.java

@@ -116,7 +116,7 @@ public class L2CabaleBufferInstance extends L2Npc
 					if (player == null || player.isInvul())
 						continue;
 
-					final int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+					final int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 					
 					if (playerCabal == winningCabal
 					        && playerCabal != SevenSigns.CABAL_NULL

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2CastleMagicianInstance.java

@@ -224,7 +224,7 @@ public class L2CastleMagicianInstance extends L2NpcInstance
 
 		if (player.isIn7sDungeon())
 		{
-			final int targetCabal = SevenSigns.getInstance().getPlayerCabal(clanLeader);
+			final int targetCabal = SevenSigns.getInstance().getPlayerCabal(clanLeader.getObjectId());
 			if (SevenSigns.getInstance().isSealValidationPeriod())
 			{
 				if (targetCabal != SevenSigns.getInstance().getCabalHighestScore())

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DawnPriestInstance.java

@@ -43,7 +43,7 @@ public class L2DawnPriestInstance extends L2SignsPriestInstance
 
 		String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH;
 		int sealGnosisOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_GNOSIS);
-		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 		boolean isSealValidationPeriod = SevenSigns.getInstance().isSealValidationPeriod();
 		boolean isCompResultsPeriod = SevenSigns.getInstance().isCompResultsPeriod();
 		int recruitPeriod = SevenSigns.getInstance().getCurrentPeriod();

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DungeonGatekeeperInstance.java

@@ -46,7 +46,7 @@ public class L2DungeonGatekeeperInstance extends L2Npc
 		String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH;
 		int sealAvariceOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_AVARICE);
 		int sealGnosisOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_GNOSIS);
-		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 		boolean isSealValidationPeriod = SevenSigns.getInstance().isSealValidationPeriod();
 		int compWinner = SevenSigns.getInstance().getCabalHighestScore();
 

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DuskPriestInstance.java

@@ -43,7 +43,7 @@ public class L2DuskPriestInstance extends L2SignsPriestInstance
 
 		String filename = SevenSigns.SEVEN_SIGNS_HTML_PATH;
 		int sealGnosisOwner = SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_GNOSIS);
-		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+		int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 		boolean isSealValidationPeriod = SevenSigns.getInstance().isSealValidationPeriod();
 		boolean isCompResultsPeriod = SevenSigns.getInstance().isCompResultsPeriod();
 		int recruitPeriod = SevenSigns.getInstance().getCurrentPeriod();

+ 4 - 3
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -7576,6 +7576,7 @@ public final class L2PcInstance extends L2Playable
 			storeRecipeShopList();
 		if (Config.STORE_UI_SETTINGS)
 			storeUISettings();
+		SevenSigns.getInstance().saveSevenSignsData(getObjectId());
 	}
 	
 	public void store()
@@ -10852,7 +10853,7 @@ public final class L2PcInstance extends L2Playable
 
         if (SevenSigns.getInstance().isSealValidationPeriod() || SevenSigns.getInstance().isCompResultsPeriod())
         {
-            if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(this) != SevenSigns.getInstance().getCabalHighestScore())
+            if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(getObjectId()) != SevenSigns.getInstance().getCabalHighestScore())
             {
                 teleToLocation(MapRegionTable.TeleportWhereType.Town);
                 setIsIn7sDungeon(false);
@@ -10861,7 +10862,7 @@ public final class L2PcInstance extends L2Playable
         }
         else
         {
-            if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(this) == SevenSigns.CABAL_NULL)
+            if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(getObjectId()) == SevenSigns.CABAL_NULL)
             {
                 teleToLocation(MapRegionTable.TeleportWhereType.Town);
                 setIsIn7sDungeon(false);
@@ -13437,7 +13438,7 @@ public final class L2PcInstance extends L2Playable
 		// because currently this is not working in L2J we do not allowing summoning
 		if (summonerChar.isIn7sDungeon())
 		{
-			int targetCabal = SevenSigns.getInstance().getPlayerCabal(targetChar);
+			int targetCabal = SevenSigns.getInstance().getPlayerCabal(targetChar.getObjectId());
 			if (SevenSigns.getInstance().isSealValidationPeriod())
 			{
 				if (targetCabal != SevenSigns.getInstance().getCabalHighestScore())

+ 10 - 10
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2SignsPriestInstance.java

@@ -123,7 +123,7 @@ public class L2SignsPriestInstance extends L2Npc
 					showChatWindow(player, val, "dusk", false);
 				break;
 			case 33: // "I want to participate" request
-				int oldCabal = SevenSigns.getInstance().getPlayerCabal(player);
+				int oldCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 
 				if (oldCabal != SevenSigns.CABAL_NULL)
 				{
@@ -223,7 +223,7 @@ public class L2SignsPriestInstance extends L2Npc
 						}
 					}
 				}
-				SevenSigns.getInstance().setPlayerInfo(player, cabal, newSeal);
+				SevenSigns.getInstance().setPlayerInfo(player.getObjectId(), cabal, newSeal);
 
 				if (cabal == SevenSigns.CABAL_DAWN)
 					player.sendPacket(new SystemMessage(SystemMessageId.SEVENSIGNS_PARTECIPATION_DAWN)); // Joined Dawn
@@ -249,14 +249,14 @@ public class L2SignsPriestInstance extends L2Npc
 			case 5:
 				if (this instanceof L2DawnPriestInstance)
 				{
-					if (SevenSigns.getInstance().getPlayerCabal(player) == SevenSigns.CABAL_NULL)
+					if (SevenSigns.getInstance().getPlayerCabal(player.getObjectId()) == SevenSigns.CABAL_NULL)
 						showChatWindow(player, val, "dawn_no", false);
 					else
 						showChatWindow(player, val, "dawn", false);
 				}
 				else
 				{
-					if (SevenSigns.getInstance().getPlayerCabal(player) == SevenSigns.CABAL_NULL)
+					if (SevenSigns.getInstance().getPlayerCabal(player.getObjectId()) == SevenSigns.CABAL_NULL)
 						showChatWindow(player, val, "dusk_no", false);
 					else
 						showChatWindow(player, val, "dusk", false);
@@ -273,7 +273,7 @@ public class L2SignsPriestInstance extends L2Npc
 				long contribGreenStoneCount = contribGreenStones == null ? 0 : contribGreenStones.getCount();
 				long contribRedStoneCount = contribRedStones == null ? 0 : contribRedStones.getCount();
 
-				long score = SevenSigns.getInstance().getPlayerContribScore(player);
+				long score = SevenSigns.getInstance().getPlayerContribScore(player.getObjectId());
 				long contributionCount = 0;
 
 				boolean contribStonesFound = false;
@@ -357,7 +357,7 @@ public class L2SignsPriestInstance extends L2Npc
 				}
 				else
 				{
-					score = SevenSigns.getInstance().addPlayerStoneContrib(player, blueContrib, greenContrib, redContrib);
+					score = SevenSigns.getInstance().addPlayerStoneContrib(player.getObjectId(), blueContrib, greenContrib, redContrib);
 					sm = new SystemMessage(SystemMessageId.CONTRIB_SCORE_INCREASED);
 					sm.addItemNumber(score);
 					player.sendPacket(sm);
@@ -379,7 +379,7 @@ public class L2SignsPriestInstance extends L2Npc
 				long greenStoneCount = greenStones == null ? 0 : greenStones.getCount();
 				long redStoneCount = redStones == null ? 0 : redStones.getCount();
 
-				long contribScore = SevenSigns.getInstance().getPlayerContribScore(player);
+				long contribScore = SevenSigns.getInstance().getPlayerContribScore(player.getObjectId());
 				boolean stonesFound = false;
 
 				if (contribScore == Config.ALT_MAXIMUM_PLAYER_CONTRIB)
@@ -478,7 +478,7 @@ public class L2SignsPriestInstance extends L2Npc
 						}
 						else
 						{
-							contribScore = SevenSigns.getInstance().addPlayerStoneContrib(player, blueContribCount, greenContribCount, redContribCount);
+							contribScore = SevenSigns.getInstance().addPlayerStoneContrib(player.getObjectId(), blueContribCount, greenContribCount, redContribCount);
 							sm = new SystemMessage(SystemMessageId.CONTRIB_SCORE_INCREASED);
 							sm.addItemNumber(contribScore);
 							player.sendPacket(sm);
@@ -549,12 +549,12 @@ public class L2SignsPriestInstance extends L2Npc
 				showChatWindow(player, SevenSigns.SEVEN_SIGNS_HTML_PATH + "blkmrkt_5.htm");
 				break;
 			case 9: // Receive Contribution Rewards
-				int playerCabal = SevenSigns.getInstance().getPlayerCabal(player);
+				int playerCabal = SevenSigns.getInstance().getPlayerCabal(player.getObjectId());
 				int winningCabal = SevenSigns.getInstance().getCabalHighestScore();
 
 				if (SevenSigns.getInstance().isSealValidationPeriod() && playerCabal == winningCabal)
 				{
-					int ancientAdenaReward = SevenSigns.getInstance().getAncientAdenaReward(player, true);
+					int ancientAdenaReward = SevenSigns.getInstance().getAncientAdenaReward(player.getObjectId(), true);
 
 					if (ancientAdenaReward < 3)
 					{

+ 3 - 2
L2_GameServer/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java

@@ -274,9 +274,10 @@ public class EnterWorld extends L2GameClientPacket
 		// Updating Seal of Strife Buff/Debuff 
 		if (SevenSigns.getInstance().isSealValidationPeriod() && SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) != SevenSigns.CABAL_NULL)
 		{
-			if (SevenSigns.getInstance().getPlayerCabal(activeChar) != SevenSigns.CABAL_NULL)
+			int cabal = SevenSigns.getInstance().getPlayerCabal(activeChar.getObjectId());
+			if (cabal != SevenSigns.CABAL_NULL)
 			{
-				if (SevenSigns.getInstance().getPlayerCabal(activeChar) == SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE))
+				if (cabal == SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE))
 					activeChar.addSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill());
 				else
 					activeChar.addSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/clientpackets/RequestSSQStatus.java

@@ -48,7 +48,7 @@ public final class RequestSSQStatus extends L2GameClientPacket
         if ((SevenSigns.getInstance().isSealValidationPeriod() || SevenSigns.getInstance().isCompResultsPeriod()) && _page == 4)
             return;
 
-		SSQStatus ssqs = new SSQStatus(activeChar, _page);
+		SSQStatus ssqs = new SSQStatus(activeChar.getObjectId(), _page);
 		activeChar.sendPacket(ssqs);
 	}
 

+ 7 - 8
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/SSQStatus.java

@@ -19,7 +19,6 @@ import java.util.logging.Logger;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.SevenSigns;
 import com.l2jserver.gameserver.SevenSignsFestival;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.templates.StatsSet;
 
@@ -46,12 +45,12 @@ public class SSQStatus extends L2GameServerPacket
     private static Logger _log = Logger.getLogger(SSQStatus.class.getName());
 
     private static final String _S__F5_SSQStatus = "[S] fb SSQStatus";
-    private L2PcInstance _activevChar;
+    private int _objectId;
     private int _page;
 
-    public SSQStatus(L2PcInstance player, int recordPage)
+    public SSQStatus(int objectId, int recordPage)
     {
-    	_activevChar = player;
+    	_objectId = objectId;
         _page = recordPage;
     }
 
@@ -107,11 +106,11 @@ public class SSQStatus extends L2GameServerPacket
                         break;
                 }
 
-                writeC(SevenSigns.getInstance().getPlayerCabal(_activevChar));
-                writeC(SevenSigns.getInstance().getPlayerSeal(_activevChar));
+                writeC(SevenSigns.getInstance().getPlayerCabal(_objectId));
+                writeC(SevenSigns.getInstance().getPlayerSeal(_objectId));
 
-                writeQ(SevenSigns.getInstance().getPlayerStoneContrib(_activevChar)); // Seal Stones Turned-In
-                writeQ(SevenSigns.getInstance().getPlayerAdenaCollect(_activevChar)); // Ancient Adena to Collect
+                writeQ(SevenSigns.getInstance().getPlayerStoneContrib(_objectId)); // Seal Stones Turned-In
+                writeQ(SevenSigns.getInstance().getPlayerAdenaCollect(_objectId)); // Ancient Adena to Collect
 
                 double dawnStoneScore = SevenSigns.getInstance().getCurrentStoneScore(SevenSigns.CABAL_DAWN);
                 int dawnFestivalScore = SevenSigns.getInstance().getCurrentFestivalScore(SevenSigns.CABAL_DAWN);

+ 2 - 2
L2_GameServer/java/com/l2jserver/gameserver/taskmanager/tasks/TaskSevenSignsUpdate.java

@@ -54,8 +54,8 @@ public class TaskSevenSignsUpdate extends Task
 	{
 		try
 		{
-			SevenSigns.getInstance().saveSevenSignsData(null, true);
-			
+			SevenSigns.getInstance().saveSevenSignsStatus();
+
 			if (!SevenSigns.getInstance().isSealValidationPeriod())
 				SevenSignsFestival.getInstance().saveFestivalData(false);
 			

+ 6 - 0
L2_GameServer/java/config/Feature.properties

@@ -242,6 +242,12 @@ AltDuskGatesMdefMult = 0.8
 # Default: True
 StrictSevenSigns = True
 
+# Save SevenSigns status only each 30 mins and after period change.
+# Player info saved only during periodic data store (set by CharacterDataStoreInterval) and logout.
+# If False then save info and status immediately after changes.
+# Default: True
+AltSevenSignsLazyUpdate = True
+
 # ---------------------------------------------------------------------------
 # Clan Reputation Points
 # ---------------------------------------------------------------------------