SiegeManager.java 10 KB

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