FortressOfTheDead.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * Copyright (C) 2004-2015 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack 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 DataPack 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 conquerablehalls.FortressOfTheDead;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import java.util.Map.Entry;
  23. import com.l2jserver.gameserver.GameTimeController;
  24. import com.l2jserver.gameserver.ThreadPoolManager;
  25. import com.l2jserver.gameserver.data.sql.impl.ClanTable;
  26. import com.l2jserver.gameserver.model.L2Clan;
  27. import com.l2jserver.gameserver.model.actor.L2Npc;
  28. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  29. import com.l2jserver.gameserver.model.entity.clanhall.ClanHallSiegeEngine;
  30. import com.l2jserver.gameserver.network.NpcStringId;
  31. import com.l2jserver.gameserver.network.clientpackets.Say2;
  32. /**
  33. * Fortress of the Dead clan hall siege script.
  34. * @author BiggBoss
  35. */
  36. public final class FortressOfTheDead extends ClanHallSiegeEngine
  37. {
  38. private static final int LIDIA = 35629;
  39. private static final int ALFRED = 35630;
  40. private static final int GISELLE = 35631;
  41. private static Map<Integer, Integer> _damageToLidia = new HashMap<>();
  42. public FortressOfTheDead()
  43. {
  44. super(FortressOfTheDead.class.getSimpleName(), "conquerablehalls", FORTRESS_OF_DEAD);
  45. addKillId(LIDIA);
  46. addKillId(ALFRED);
  47. addKillId(GISELLE);
  48. addSpawnId(LIDIA);
  49. addSpawnId(ALFRED);
  50. addSpawnId(GISELLE);
  51. addAttackId(LIDIA);
  52. }
  53. @Override
  54. public String onSpawn(L2Npc npc)
  55. {
  56. if (npc.getId() == LIDIA)
  57. {
  58. broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.HMM_THOSE_WHO_ARE_NOT_OF_THE_BLOODLINE_ARE_COMING_THIS_WAY_TO_TAKE_OVER_THE_CASTLE_HUMPH_THE_BITTER_GRUDGES_OF_THE_DEAD_YOU_MUST_NOT_MAKE_LIGHT_OF_THEIR_POWER);
  59. }
  60. else if (npc.getId() == ALFRED)
  61. {
  62. broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.HEH_HEH_I_SEE_THAT_THE_FEAST_HAS_BEGUN_BE_WARY_THE_CURSE_OF_THE_HELLMANN_FAMILY_HAS_POISONED_THIS_LAND);
  63. }
  64. else if (npc.getId() == GISELLE)
  65. {
  66. broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.ARISE_MY_FAITHFUL_SERVANTS_YOU_MY_PEOPLE_WHO_HAVE_INHERITED_THE_BLOOD_IT_IS_THE_CALLING_OF_MY_DAUGHTER_THE_FEAST_OF_BLOOD_WILL_NOW_BEGIN);
  67. }
  68. return null;
  69. }
  70. @Override
  71. public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
  72. {
  73. if (!_hall.isInSiege())
  74. {
  75. return null;
  76. }
  77. synchronized (this)
  78. {
  79. final L2Clan clan = attacker.getClan();
  80. if ((clan != null) && checkIsAttacker(clan))
  81. {
  82. final int id = clan.getId();
  83. if ((id > 0) && _damageToLidia.containsKey(id))
  84. {
  85. int newDamage = _damageToLidia.get(id);
  86. newDamage += damage;
  87. _damageToLidia.put(id, newDamage);
  88. }
  89. else
  90. {
  91. _damageToLidia.put(id, damage);
  92. }
  93. }
  94. }
  95. return null;
  96. }
  97. @Override
  98. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  99. {
  100. if (!_hall.isInSiege())
  101. {
  102. return null;
  103. }
  104. final int npcId = npc.getId();
  105. if ((npcId == ALFRED) || (npcId == GISELLE))
  106. {
  107. broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.AARGH_IF_I_DIE_THEN_THE_MAGIC_FORCE_FIELD_OF_BLOOD_WILL);
  108. }
  109. if (npcId == LIDIA)
  110. {
  111. broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.GRARR_FOR_THE_NEXT_2_MINUTES_OR_SO_THE_GAME_ARENA_ARE_WILL_BE_CLEANED_THROW_ANY_ITEMS_YOU_DONT_NEED_TO_THE_FLOOR_NOW);
  112. _missionAccomplished = true;
  113. synchronized (this)
  114. {
  115. cancelSiegeTask();
  116. endSiege();
  117. }
  118. }
  119. return null;
  120. }
  121. @Override
  122. public L2Clan getWinner()
  123. {
  124. int counter = 0;
  125. int damagest = 0;
  126. for (Entry<Integer, Integer> e : _damageToLidia.entrySet())
  127. {
  128. final int damage = e.getValue();
  129. if (damage > counter)
  130. {
  131. counter = damage;
  132. damagest = e.getKey();
  133. }
  134. }
  135. return ClanTable.getInstance().getClan(damagest);
  136. }
  137. @Override
  138. public void startSiege()
  139. {
  140. // Siege must start at night
  141. int hoursLeft = (GameTimeController.getInstance().getGameTime() / 60) % 24;
  142. if ((hoursLeft < 0) || (hoursLeft > 6))
  143. {
  144. cancelSiegeTask();
  145. long scheduleTime = (24 - hoursLeft) * 10 * 60000;
  146. _siegeTask = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeStarts(), scheduleTime);
  147. }
  148. else
  149. {
  150. super.startSiege();
  151. }
  152. }
  153. public static void main(String[] args)
  154. {
  155. new FortressOfTheDead();
  156. }
  157. }