rendered paste bodyIndex: 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
+}