Index: java/net/sf/l2j/gameserver/SevenSigns.java =================================================================== --- java/net/sf/l2j/gameserver/SevenSigns.java (revisione 1681) +++ java/net/sf/l2j/gameserver/SevenSigns.java (copia locale) @@ -1,49 +1,35 @@ package net.sf.l2j.gameserver; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Calendar; -import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.logging.Logger; -import javolution.util.FastList; import javolution.util.FastMap; import net.sf.l2j.Config; import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.model.AutoChatHandler; import net.sf.l2j.gameserver.model.AutoSpawnHandler; -import net.sf.l2j.gameserver.model.L2MinionData; -import net.sf.l2j.gameserver.model.L2Spawn; import net.sf.l2j.gameserver.model.L2World; -import net.sf.l2j.gameserver.model.AutoChatHandler.AutoChatInstance; import net.sf.l2j.gameserver.model.AutoSpawnHandler.AutoSpawnInstance; -import net.sf.l2j.gameserver.model.actor.instance.L2MinionInstance; -import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance; -import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.SignsSky; import net.sf.l2j.gameserver.serverpackets.SystemMessage; -import net.sf.l2j.gameserver.templates.L2NpcTemplate; import net.sf.l2j.gameserver.templates.StatsSet; /** * Seven Signs Engine * * TODO: - * - Currently all those in the winning cabal can enter the catacombs and necropolises. - * The official site says this is seal-based rather than winner-based. If so, then - * this needs to be factored in also. * - Implementation of the Seal of Strife for sieges. * * @author Tempy */ -public class SevenSigns { +public class SevenSigns +{ protected static Logger _log = Logger.getLogger(SevenSigns.class.getName()); private static SevenSigns _instance; @@ -85,6 +71,9 @@ public static final int PREACHER_NPC_ID = 8093; public static final int MAMMON_MERCHANT_ID = 8113; public static final int MAMMON_BLACKSMITH_ID = 8126; + public static final int MAMMON_MARKETEER_ID = 8092; + public static final int SPIRIT_IN_ID = 8111; + public static final int SPIRIT_OUT_ID = 8112; public static final int LILITH_NPC_ID = 10283; public static final int ANAKIM_NPC_ID = 10286; @@ -97,194 +86,13 @@ public static final int SEAL_STONE_GREEN_VALUE = 5; public static final int SEAL_STONE_RED_VALUE = 10; - private static final int BLUE_CONTRIB_POINTS = 1; - private static final int GREEN_CONTRIB_POINTS = 5; - private static final int RED_CONTRIB_POINTS = 10; + public static final int BLUE_CONTRIB_POINTS = 3; + public static final int GREEN_CONTRIB_POINTS = 5; + public static final int RED_CONTRIB_POINTS = 10; // There is a max on official, but not sure what! - private static final int MAXIMUM_PLAYER_CONTRIB = 300000; + public static final int MAXIMUM_PLAYER_CONTRIB = Math.round(1000000 * Config.RATE_DROP_ITEMS); - // NPC Related Constants \\ - private static final int [][] merchantSpawns = { - {172373, -17833, -4901}, // Disciples - {83175, 208998, -5439}, // Saints - {118343, 132578, -4831}, // Martyrs - {-52172, 78884, -4741}, // Ascetics - {-21657, 77164, -5173}, // Patriots - {111337, 173804, -5439}, // Worshippers - {45029, 123802, -5413}, // Pilgrims - {-41350, 209876, -5087}, // Sacrifice - }; - - private static final int [][] blacksmithSpawns = { - {114013, 84326, -6541}, // Forbidden Path - {-19360, 13278, -4901}, // Dark Omens - {140519, 79464, -5429}, // Witch - {77787, 78176, -5125}, // Apostate - {46303, 170091, -4981}, // Branded - {43093, 143706, -5381}, // Heretics - }; - - private static final int[][] oratorSpawns = { - //Dion - {16901, 144748, -3027}, - {17557, 147084, -3150}, - {20826, 145769, -3171}, - {19038, 142923, -3078}, - //Oren - {81002, 53495, -1586}, - {80039, 54291, -1586}, - {81527, 56009, -1551}, - //Aden - {143926, 26468, -2338}, - {150417, 25182, -2141}, - {147460, 20537, -2101}, - //Giran - {85328, 147352, -3431}, - {83872, 143882, -3431}, - {81540, 144204, -3559}, - {77830, 148627, -3623}, - {81556, 152183, -3559}, - //Hunters Village - {114907, 77916, -2662}, - {115509, 74857, -2625}, - {118273, 74592, -2529}, - //Gludio - {-12344, 123605, -3132}, - {-14199, 126128, -3171}, - {-16168, 124129, -3143}, - {-14563, 121461, -3015}, - //Gludin - {-83157, 149846, -3155}, - {-84356, 152742, -3204}, - {-79563, 152726, -3204}, - {-79123, 155098, -3204}, - //Heine - {115482, 219266, -3689}, - {107251, 218166, -3701} - }; - - private static final int[][] preacherSpawns = { - //Giran - {83319, 148054, -3431}, - {83894, 147495, -3431}, - {81547, 150347, -3559}, - {79825, 148619, -3559}, - {81535, 146866, -3559}, - //Dion - {15722, 142877, -2732}, - {18172, 145740, -3140}, - {19096, 143980, -3096}, - {19823, 145863, -3142}, - //Gludin - {-80690, 149996, -3070}, - {-83107, 150270, -3155}, - {-83070, 152740, -3204}, - {-80037, 154344, -3204}, - {-80752, 152738, -3204}, - //Gludio - {-12591, 122673, -3142}, - {-13252, 123689, -3143}, - {-14268, 124941, -3156}, - {-15549, 124170, -3143}, - {-14480, 122330, -3126}, - //Heine - {111389, 219257, -3572}, - {113479, 217795, -3731}, - {114086, 220214, -3568}, - {110189, 221393, -3569}, - {107256, 218615, -3701}, - {109660, 217339, -3775}, - //Hunters Village - {117098, 77066, -2720}, - {115893, 77551, -2729}, - {115936, 75382, -2625}, - {118049, 75783, -2715}, - //Oren - {82863, 53290, -1522}, - {80617, 54116, -1586}, - {80416, 55959, -1586}, - {82048, 55417, -1551}, - //Aden - {147440, 30047, -2487}, - {145394, 27629, -2295}, - {149515, 27641, -2295}, - {149899, 24719, -2167}, - {147459, 21148, -2167}, - {145015, 25269, -2167}, - {146616, 25816, -2039}, - {148013, 27029, -2231} - }; - - public static final String[] chatDoomPreacher = { - "The prophecy of doom has awoken!", - "All is lost! Prepare to meet the goddess of death!", - "All is lost! The prophecy of destruction has been fulfilled!", - "This world will soon be annihilated!", - "%player_cabal_loser%! You might as well give up!", - "%player_cabal_loser%! You bring an ill wind!", - "A curse upon you!", - "%player_cabal_loser%! All is lost! Prepare to meet the goddess of death!" - }; - - public static final String[] chatOratorRevelations = { - "%player_cabal_winner%, the time for glory is at hand!", - "The prophecy of darkness has been fulfilled!", - "The prophecy of darkness has come to pass!", - "As foretold in the prophecy of darkness, the era of chaos has begun!", - "The day of judgment is near!", - "%player_cabal_winner%, Darkness shall be banished forever!", - "All hail the eternal twilight!", - "%player_cabal_winner%! I bestow on you the authority of the abyss!" - }; - - // Current max of 30 items sellable right now. - // Updated to include official prices as well as "modern" adena price. - public static final String[][] priestItems = { - // Greater Healing Potion - {"1539","1080","90","icon.etc_reagent_white_i00"}, - // Blessed Rez Scroll for Pet - {"6387","6000","500","etc_scroll_of_resurrection_pet_i01"}, - // Greater Haste Potion - {"1374","3600","360","etc_lesser_potion_green_i00"}, - // Greater Swift Attack Potion - {"1375","7200","600","etc_lesser_potion_purple_i00"}, - // Greater Magic Haste Potion - {"6036","7200","600","etc_potion_of_acumen3_i00"}, - // CP Potion - {"5591","240","20","etc_cp_potion_i00"}, - // Greater CP Potion - {"5592","600","50","etc_cp_potion_i01"}, - // SP Scroll - Low Grade - {"5593","2400","200","etc_sp_scroll1_i00"}, - // SP Scroll - Medium Grade - {"5594","24000","2000","etc_sp_scroll2_i00"}, - // SP Scroll - High Grade - {"5595","480000","40000","etc_sp_scroll3_i00"}, - // Mystery Potion - {"5234","12000","1000","etc_lesser_potion_clear_i00"}, - // Facelifting Potions A-C - {"5235","24000","2000","etc_lesser_potion_purple_i00"}, {"5236","24000","2000","etc_lesser_potion_purple_i00"}, - {"5237","24000","2000","etc_lesser_potion_purple_i00"}, - // Hair Dye Potions A-D - {"5238","24000","2000","etc_lesser_potion_scarlet_i00"}, {"5239","24000","2000","etc_lesser_potion_scarlet_i00"}, - {"5240","24000","2000","etc_lesser_potion_scarlet_i00"}, {"5241","24000","2000","etc_lesser_potion_scarlet_i00"}, - // Hair Style Change Potion A-G - {"5242","24000","2000","etc_lesser_potion_green_i00"}, {"5243","24000","2000","etc_lesser_potion_green_i00"}, - {"5244","24000","2000","etc_lesser_potion_green_i00"}, {"5245","24000","2000","etc_lesser_potion_green_i00"}, - {"5246","24000","2000","etc_lesser_potion_green_i00"}, {"5247","24000","2000","etc_lesser_potion_green_i00"}, - // Party Masks - {"5808","600000","50000","etc_party_mask_i00"}, {"6394","600000","50000","etc_party_mask_i01"}, - // Squeaking Shoes - {"5590","420000","35000","armor_cloth_shoes_i00"}, - // Record of the Seven Signs - {"5707","600","50","etc_ssq_scroll_i00"} - // Luck Charms - //{"5703","5000","etc_charm_of_luck_i00"},{"5803","7500","etc_charm_of_luck_i00"}, - //{"5804","11000","etc_charm_of_luck_i00"},{"5805","15000","etc_charm_of_luck_i00"},{"5806","21000","etc_charm_of_luck_i00"}, - //{"5807","28500","etc_charm_of_luck_i00"}, - }; // Total: 28 Items - private final Calendar _calendar = Calendar.getInstance(); protected int _activePeriod; @@ -296,10 +104,7 @@ protected int _compWinner; protected int _previousWinner; - private boolean _initializedSpawns; - private Map _signsPlayerData; - private List _signsNPCInsts; private Map _signsSealOwners; private Map _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 _oratorSpawns; + private static Map _preacherSpawns; + private static Map _marketeerSpawns; public SevenSigns() { _signsPlayerData = new FastMap(); - _signsNPCInsts = new FastList(); _signsSealOwners = new FastMap(); _signsDuskSealTotals = new FastMap(); _signsDawnSealTotals = new FastMap(); - 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. - *
- * 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 @@ *

* 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>(); - 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 tempData = _festivalData.get(festivalCycle); - - if (tempData == null) - tempData = new FastMap(); - - 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 tempData = _festivalData.get(festivalCycle); + + if (tempData == null) + tempData = new FastMap(); + + 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 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 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 +}