SiegeManager.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. /*
  2. * Copyright (C) 2004-2013 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.gameserver.instancemanager;
  20. import java.sql.Connection;
  21. import java.sql.PreparedStatement;
  22. import java.sql.ResultSet;
  23. import java.util.ArrayList;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.StringTokenizer;
  28. import java.util.logging.Level;
  29. import java.util.logging.Logger;
  30. import javolution.util.FastList;
  31. import com.l2jserver.Config;
  32. import com.l2jserver.L2DatabaseFactory;
  33. import com.l2jserver.gameserver.datatables.SkillTable;
  34. import com.l2jserver.gameserver.model.L2Clan;
  35. import com.l2jserver.gameserver.model.L2Object;
  36. import com.l2jserver.gameserver.model.Location;
  37. import com.l2jserver.gameserver.model.TowerSpawn;
  38. import com.l2jserver.gameserver.model.actor.L2Character;
  39. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  40. import com.l2jserver.gameserver.model.entity.Castle;
  41. import com.l2jserver.gameserver.model.entity.Siege;
  42. import com.l2jserver.gameserver.model.skills.L2Skill;
  43. import com.l2jserver.util.PropertiesParser;
  44. public final class SiegeManager
  45. {
  46. private static final Logger _log = Logger.getLogger(SiegeManager.class.getName());
  47. private final Map<Integer, List<TowerSpawn>> _controlTowers = new HashMap<>();
  48. private final Map<Integer, List<TowerSpawn>> _flameTowers = new HashMap<>();
  49. private int _attackerMaxClans = 500; // Max number of clans
  50. private int _attackerRespawnDelay = 0; // Time in ms. Changeable in siege.config
  51. private int _defenderMaxClans = 500; // Max number of clans
  52. private int _flagMaxCount = 1; // Changeable in siege.config
  53. private int _siegeClanMinLevel = 5; // Changeable in siege.config
  54. private int _siegeLength = 120; // Time in minute. Changeable in siege.config
  55. private int _bloodAllianceReward = 0; // Number of Blood Alliance items reward for successful castle defending
  56. protected SiegeManager()
  57. {
  58. load();
  59. }
  60. public final void addSiegeSkills(L2PcInstance character)
  61. {
  62. for (L2Skill sk : SkillTable.getInstance().getSiegeSkills(character.isNoble(), character.getClan().getCastleId() > 0))
  63. {
  64. character.addSkill(sk, false);
  65. }
  66. }
  67. /**
  68. * @param activeChar The L2Character of the character can summon
  69. * @param isCheckOnly
  70. * @return true if character summon
  71. */
  72. public final boolean checkIfOkToSummon(L2Character activeChar, boolean isCheckOnly)
  73. {
  74. if (!(activeChar instanceof L2PcInstance))
  75. {
  76. return false;
  77. }
  78. String text = "";
  79. L2PcInstance player = (L2PcInstance) activeChar;
  80. Castle castle = CastleManager.getInstance().getCastle(player);
  81. if ((castle == null) || (castle.getCastleId() <= 0))
  82. {
  83. text = "You must be on castle ground to summon this";
  84. }
  85. else if (!castle.getSiege().getIsInProgress())
  86. {
  87. text = "You can only summon this during a siege.";
  88. }
  89. else if ((player.getClanId() != 0) && (castle.getSiege().getAttackerClan(player.getClanId()) == null))
  90. {
  91. text = "You can only summon this as a registered attacker.";
  92. }
  93. else
  94. {
  95. return true;
  96. }
  97. if (!isCheckOnly)
  98. {
  99. player.sendMessage(text);
  100. }
  101. return false;
  102. }
  103. /**
  104. * @param clan The L2Clan of the player
  105. * @param castleid
  106. * @return true if the clan is registered or owner of a castle
  107. */
  108. public final boolean checkIsRegistered(L2Clan clan, int castleid)
  109. {
  110. if (clan == null)
  111. {
  112. return false;
  113. }
  114. if (clan.getCastleId() > 0)
  115. {
  116. return true;
  117. }
  118. boolean register = false;
  119. try (Connection con = L2DatabaseFactory.getInstance().getConnection();
  120. PreparedStatement statement = con.prepareStatement("SELECT clan_id FROM siege_clans where clan_id=? and castle_id=?"))
  121. {
  122. statement.setInt(1, clan.getId());
  123. statement.setInt(2, castleid);
  124. try (ResultSet rs = statement.executeQuery())
  125. {
  126. while (rs.next())
  127. {
  128. register = true;
  129. break;
  130. }
  131. }
  132. }
  133. catch (Exception e)
  134. {
  135. _log.log(Level.WARNING, getClass().getSimpleName() + ": Exception: checkIsRegistered(): " + e.getMessage(), e);
  136. }
  137. return register;
  138. }
  139. public final void removeSiegeSkills(L2PcInstance character)
  140. {
  141. for (L2Skill sk : SkillTable.getInstance().getSiegeSkills(character.isNoble(), character.getClan().getCastleId() > 0))
  142. {
  143. character.removeSkill(sk);
  144. }
  145. }
  146. private final void load()
  147. {
  148. final PropertiesParser siegeSettings = new PropertiesParser(Config.SIEGE_CONFIGURATION_FILE);
  149. // Siege setting
  150. _attackerMaxClans = siegeSettings.getInt("AttackerMaxClans", 500);
  151. _attackerRespawnDelay = siegeSettings.getInt("AttackerRespawn", 0);
  152. _defenderMaxClans = siegeSettings.getInt("DefenderMaxClans", 500);
  153. _flagMaxCount = siegeSettings.getInt("MaxFlags", 1);
  154. _siegeClanMinLevel = siegeSettings.getInt("SiegeClanMinLevel", 5);
  155. _siegeLength = siegeSettings.getInt("SiegeLength", 120);
  156. _bloodAllianceReward = siegeSettings.getInt("BloodAllianceReward", 0);
  157. for (Castle castle : CastleManager.getInstance().getCastles())
  158. {
  159. final List<TowerSpawn> controlTowers = new ArrayList<>();
  160. for (int i = 1; i < 0xFF; i++)
  161. {
  162. final String settingsKeyName = castle.getName() + "ControlTower" + i;
  163. if (!siegeSettings.containskey(settingsKeyName))
  164. {
  165. break;
  166. }
  167. final StringTokenizer st = new StringTokenizer(siegeSettings.getString(settingsKeyName, ""), ",");
  168. try
  169. {
  170. final int x = Integer.parseInt(st.nextToken());
  171. final int y = Integer.parseInt(st.nextToken());
  172. final int z = Integer.parseInt(st.nextToken());
  173. final int npcId = Integer.parseInt(st.nextToken());
  174. controlTowers.add(new TowerSpawn(npcId, new Location(x, y, z)));
  175. }
  176. catch (Exception e)
  177. {
  178. _log.warning(getClass().getSimpleName() + ": Error while loading control tower(s) for " + castle.getName() + " castle.");
  179. }
  180. }
  181. final List<TowerSpawn> flameTowers = new ArrayList<>();
  182. for (int i = 1; i < 0xFF; i++)
  183. {
  184. final String settingsKeyName = castle.getName() + "FlameTower" + i;
  185. if (!siegeSettings.containskey(settingsKeyName))
  186. {
  187. break;
  188. }
  189. final StringTokenizer st = new StringTokenizer(siegeSettings.getString(settingsKeyName, ""), ",");
  190. try
  191. {
  192. final int x = Integer.parseInt(st.nextToken());
  193. final int y = Integer.parseInt(st.nextToken());
  194. final int z = Integer.parseInt(st.nextToken());
  195. final int npcId = Integer.parseInt(st.nextToken());
  196. final List<Integer> zoneList = new ArrayList<>();
  197. while (st.hasMoreTokens())
  198. {
  199. zoneList.add(Integer.parseInt(st.nextToken()));
  200. }
  201. flameTowers.add(new TowerSpawn(npcId, new Location(x, y, z), zoneList));
  202. }
  203. catch (Exception e)
  204. {
  205. _log.warning(getClass().getSimpleName() + ": Error while loading flame tower(s) for " + castle.getName() + " castle.");
  206. }
  207. }
  208. _controlTowers.put(castle.getCastleId(), controlTowers);
  209. _flameTowers.put(castle.getCastleId(), flameTowers);
  210. MercTicketManager.MERCS_MAX_PER_CASTLE[castle.getCastleId() - 1] = siegeSettings.getInt(castle.getName() + "MaxMercenaries", MercTicketManager.MERCS_MAX_PER_CASTLE[castle.getCastleId() - 1]);
  211. if (castle.getOwnerId() != 0)
  212. {
  213. loadTrapUpgrade(castle.getCastleId());
  214. }
  215. }
  216. }
  217. public final List<TowerSpawn> getControlTowers(int castleId)
  218. {
  219. return _controlTowers.get(castleId);
  220. }
  221. public final List<TowerSpawn> getFlameTowers(int castleId)
  222. {
  223. return _flameTowers.get(castleId);
  224. }
  225. public final int getAttackerMaxClans()
  226. {
  227. return _attackerMaxClans;
  228. }
  229. public final int getAttackerRespawnDelay()
  230. {
  231. return _attackerRespawnDelay;
  232. }
  233. public final int getDefenderMaxClans()
  234. {
  235. return _defenderMaxClans;
  236. }
  237. public final int getFlagMaxCount()
  238. {
  239. return _flagMaxCount;
  240. }
  241. public final Siege getSiege(Location loc)
  242. {
  243. return getSiege(loc.getX(), loc.getY(), loc.getZ());
  244. }
  245. public final Siege getSiege(L2Object activeObject)
  246. {
  247. return getSiege(activeObject.getX(), activeObject.getY(), activeObject.getZ());
  248. }
  249. public final Siege getSiege(int x, int y, int z)
  250. {
  251. for (Castle castle : CastleManager.getInstance().getCastles())
  252. {
  253. if (castle.getSiege().checkIfInZone(x, y, z))
  254. {
  255. return castle.getSiege();
  256. }
  257. }
  258. return null;
  259. }
  260. public final int getSiegeClanMinLevel()
  261. {
  262. return _siegeClanMinLevel;
  263. }
  264. public final int getSiegeLength()
  265. {
  266. return _siegeLength;
  267. }
  268. public final int getBloodAllianceReward()
  269. {
  270. return _bloodAllianceReward;
  271. }
  272. public final List<Siege> getSieges()
  273. {
  274. FastList<Siege> sieges = new FastList<>();
  275. for (Castle castle : CastleManager.getInstance().getCastles())
  276. {
  277. sieges.add(castle.getSiege());
  278. }
  279. return sieges;
  280. }
  281. private final void loadTrapUpgrade(int castleId)
  282. {
  283. try (Connection con = L2DatabaseFactory.getInstance().getConnection();
  284. PreparedStatement ps = con.prepareStatement("SELECT * FROM castle_trapupgrade WHERE castleId=?"))
  285. {
  286. ps.setInt(1, castleId);
  287. try (ResultSet rs = ps.executeQuery())
  288. {
  289. while (rs.next())
  290. {
  291. _flameTowers.get(castleId).get(rs.getInt("towerIndex")).setUpgradeLevel(rs.getInt("level"));
  292. }
  293. }
  294. }
  295. catch (Exception e)
  296. {
  297. _log.log(Level.WARNING, "Exception: loadTrapUpgrade(): " + e.getMessage(), e);
  298. }
  299. }
  300. public static final SiegeManager getInstance()
  301. {
  302. return SingletonHolder._instance;
  303. }
  304. private static class SingletonHolder
  305. {
  306. protected static final SiegeManager _instance = new SiegeManager();
  307. }
  308. }