SiegeManager.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  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.L2Properties;
  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.getClanId());
  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 L2Properties siegeSettings = new L2Properties();
  149. try
  150. {
  151. siegeSettings.load(Config.SIEGE_CONFIGURATION_FILE);
  152. }
  153. catch (Exception e)
  154. {
  155. _log.log(Level.WARNING, getClass().getSimpleName() + ": Error while loading Siege settings!", e);
  156. }
  157. // Siege setting
  158. _attackerMaxClans = Integer.parseInt(siegeSettings.getProperty("AttackerMaxClans", "500"));
  159. _attackerRespawnDelay = Integer.parseInt(siegeSettings.getProperty("AttackerRespawn", "0"));
  160. _defenderMaxClans = Integer.parseInt(siegeSettings.getProperty("DefenderMaxClans", "500"));
  161. _flagMaxCount = Integer.parseInt(siegeSettings.getProperty("MaxFlags", "1"));
  162. _siegeClanMinLevel = Integer.parseInt(siegeSettings.getProperty("SiegeClanMinLevel", "5"));
  163. _siegeLength = Integer.parseInt(siegeSettings.getProperty("SiegeLength", "120"));
  164. _bloodAllianceReward = Integer.parseInt(siegeSettings.getProperty("BloodAllianceReward", "0"));
  165. for (Castle castle : CastleManager.getInstance().getCastles())
  166. {
  167. final List<TowerSpawn> controlTowers = new ArrayList<>();
  168. for (int i = 1; i < 0xFF; i++)
  169. {
  170. if (!siegeSettings.containsKey(castle.getName() + "ControlTower" + i))
  171. {
  172. break;
  173. }
  174. final StringTokenizer st = new StringTokenizer(siegeSettings.getProperty(castle.getName() + "ControlTower" + i).trim(), ",");
  175. try
  176. {
  177. final int x = Integer.parseInt(st.nextToken());
  178. final int y = Integer.parseInt(st.nextToken());
  179. final int z = Integer.parseInt(st.nextToken());
  180. final int npcId = Integer.parseInt(st.nextToken());
  181. controlTowers.add(new TowerSpawn(npcId, new Location(x, y, z)));
  182. }
  183. catch (Exception e)
  184. {
  185. _log.warning(getClass().getSimpleName() + ": Error while loading control tower(s) for " + castle.getName() + " castle.");
  186. }
  187. }
  188. final List<TowerSpawn> flameTowers = new ArrayList<>();
  189. for (int i = 1; i < 0xFF; i++)
  190. {
  191. if (!siegeSettings.containsKey(castle.getName() + "FlameTower" + i))
  192. {
  193. break;
  194. }
  195. final StringTokenizer st = new StringTokenizer(siegeSettings.getProperty(castle.getName() + "FlameTower" + i).trim(), ",");
  196. try
  197. {
  198. final int x = Integer.parseInt(st.nextToken());
  199. final int y = Integer.parseInt(st.nextToken());
  200. final int z = Integer.parseInt(st.nextToken());
  201. final int npcId = Integer.parseInt(st.nextToken());
  202. final List<Integer> zoneList = new ArrayList<>();
  203. while (st.hasMoreTokens())
  204. {
  205. zoneList.add(Integer.parseInt(st.nextToken()));
  206. }
  207. flameTowers.add(new TowerSpawn(npcId, new Location(x, y, z), zoneList));
  208. }
  209. catch (Exception e)
  210. {
  211. _log.warning(getClass().getSimpleName() + ": Error while loading flame tower(s) for " + castle.getName() + " castle.");
  212. }
  213. }
  214. _controlTowers.put(castle.getCastleId(), controlTowers);
  215. _flameTowers.put(castle.getCastleId(), flameTowers);
  216. MercTicketManager.MERCS_MAX_PER_CASTLE[castle.getCastleId() - 1] = Integer.parseInt(siegeSettings.getProperty(castle.getName() + "MaxMercenaries", Integer.toString(MercTicketManager.MERCS_MAX_PER_CASTLE[castle.getCastleId() - 1])).trim());
  217. if (castle.getOwnerId() != 0)
  218. {
  219. loadTrapUpgrade(castle.getCastleId());
  220. }
  221. }
  222. }
  223. public final List<TowerSpawn> getControlTowers(int castleId)
  224. {
  225. return _controlTowers.get(castleId);
  226. }
  227. public final List<TowerSpawn> getFlameTowers(int castleId)
  228. {
  229. return _flameTowers.get(castleId);
  230. }
  231. public final int getAttackerMaxClans()
  232. {
  233. return _attackerMaxClans;
  234. }
  235. public final int getAttackerRespawnDelay()
  236. {
  237. return _attackerRespawnDelay;
  238. }
  239. public final int getDefenderMaxClans()
  240. {
  241. return _defenderMaxClans;
  242. }
  243. public final int getFlagMaxCount()
  244. {
  245. return _flagMaxCount;
  246. }
  247. public final Siege getSiege(L2Object activeObject)
  248. {
  249. return getSiege(activeObject.getX(), activeObject.getY(), activeObject.getZ());
  250. }
  251. public final Siege getSiege(int x, int y, int z)
  252. {
  253. for (Castle castle : CastleManager.getInstance().getCastles())
  254. {
  255. if (castle.getSiege().checkIfInZone(x, y, z))
  256. {
  257. return castle.getSiege();
  258. }
  259. }
  260. return null;
  261. }
  262. public final int getSiegeClanMinLevel()
  263. {
  264. return _siegeClanMinLevel;
  265. }
  266. public final int getSiegeLength()
  267. {
  268. return _siegeLength;
  269. }
  270. public final int getBloodAllianceReward()
  271. {
  272. return _bloodAllianceReward;
  273. }
  274. public final List<Siege> getSieges()
  275. {
  276. FastList<Siege> sieges = new FastList<>();
  277. for (Castle castle : CastleManager.getInstance().getCastles())
  278. {
  279. sieges.add(castle.getSiege());
  280. }
  281. return sieges;
  282. }
  283. private final void loadTrapUpgrade(int castleId)
  284. {
  285. try (Connection con = L2DatabaseFactory.getInstance().getConnection();
  286. PreparedStatement ps = con.prepareStatement("SELECT * FROM castle_trapupgrade WHERE castleId=?"))
  287. {
  288. ps.setInt(1, castleId);
  289. try (ResultSet rs = ps.executeQuery())
  290. {
  291. while (rs.next())
  292. {
  293. _flameTowers.get(castleId).get(rs.getInt("towerIndex")).setUpgradeLevel(rs.getInt("level"));
  294. }
  295. }
  296. }
  297. catch (Exception e)
  298. {
  299. _log.log(Level.WARNING, "Exception: loadTrapUpgrade(): " + e.getMessage(), e);
  300. }
  301. }
  302. public static final SiegeManager getInstance()
  303. {
  304. return SingletonHolder._instance;
  305. }
  306. private static class SingletonHolder
  307. {
  308. protected static final SiegeManager _instance = new SiegeManager();
  309. }
  310. }