TerritoryManagers.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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 ai.npc.TerritoryManagers;
  20. import ai.npc.AbstractNpcAI;
  21. import com.l2jserver.gameserver.data.xml.impl.MultisellData;
  22. import com.l2jserver.gameserver.enums.Race;
  23. import com.l2jserver.gameserver.instancemanager.CastleManager;
  24. import com.l2jserver.gameserver.instancemanager.QuestManager;
  25. import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
  26. import com.l2jserver.gameserver.model.actor.L2Npc;
  27. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  28. import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  29. import com.l2jserver.gameserver.model.quest.Quest;
  30. import com.l2jserver.gameserver.model.quest.QuestState;
  31. import com.l2jserver.gameserver.model.quest.State;
  32. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  33. import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  34. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  35. import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  36. /**
  37. * Retail AI for Territory Managers.
  38. * @author Zoey76
  39. * @version 1.1
  40. */
  41. public final class TerritoryManagers extends AbstractNpcAI
  42. {
  43. private static final int[] preciousSoul1ItemIds =
  44. {
  45. 7587,
  46. 7588,
  47. 7589,
  48. 7597,
  49. 7598,
  50. 7599
  51. };
  52. private static final int[] preciousSoul2ItemIds =
  53. {
  54. 7595
  55. };
  56. private static final int[] preciousSoul3ItemIds =
  57. {
  58. 7678,
  59. 7591,
  60. 7592,
  61. 7593
  62. };
  63. private TerritoryManagers()
  64. {
  65. super(TerritoryManagers.class.getSimpleName(), "ai/npc");
  66. for (int i = 0; i < 9; i++)
  67. {
  68. addFirstTalkId(36490 + i);
  69. addTalkId(36490 + i);
  70. addStartNpc(36490 + i);
  71. }
  72. }
  73. @Override
  74. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  75. {
  76. if ((player.getClassId().level() < 2) || (player.getLevel() < 40))
  77. {
  78. // If the player does not have the second class transfer or is under level 40, it cannot continue.
  79. return "36490-08.html";
  80. }
  81. return npc.getId() + ".html";
  82. }
  83. @Override
  84. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  85. {
  86. String htmltext = null;
  87. final int npcId = npc.getId();
  88. final int itemId = 13757 + (npcId - 36490);
  89. final int territoryId = 81 + (npcId - 36490);
  90. switch (event)
  91. {
  92. case "36490-04.html":
  93. {
  94. // L2J Custom for minimum badges required.
  95. final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
  96. html.setFile(player.getHtmlPrefix(), "data/scripts/ai/npc/TerritoryManagers/36490-04.html");
  97. html.replace("%badge%", String.valueOf(TerritoryWarManager.MINTWBADGEFORNOBLESS));
  98. player.sendPacket(html);
  99. break;
  100. }
  101. case "BuyProducts":
  102. {
  103. if (player.getInventory().getItemByItemId(itemId) != null)
  104. {
  105. // If the player has at least one Territory Badges then show the multisell.
  106. final int multiSellId = 364900001 + ((npcId - 36490) * 10000);
  107. MultisellData.getInstance().separateAndSend(multiSellId, player, npc, false);
  108. }
  109. else
  110. {
  111. // If the player does not have Territory Badges, it cannot continue.
  112. htmltext = "36490-02.html";
  113. }
  114. break;
  115. }
  116. case "MakeMeNoble":
  117. {
  118. if (player.getInventory().getInventoryItemCount(itemId, -1) < TerritoryWarManager.MINTWBADGEFORNOBLESS)
  119. {
  120. // If the player does not have enough Territory Badges, it cannot continue.
  121. htmltext = "36490-02.html";
  122. }
  123. else if (player.isNoble())
  124. {
  125. // If the player is already Noblesse, it cannot continue.
  126. htmltext = "36490-05.html";
  127. }
  128. else if (player.getLevel() < 75)
  129. {
  130. // If the player is not level 75 or greater, it cannot continue.
  131. htmltext = "36490-06.html";
  132. }
  133. else
  134. {
  135. // Complete the Noblesse related quests.
  136. // Possessor of a Precious Soul - 1 (241)
  137. processNoblesseQuest(player, 241, preciousSoul1ItemIds);
  138. // Possessor of a Precious Soul - 2 (242)
  139. processNoblesseQuest(player, 242, preciousSoul2ItemIds);
  140. // Possessor of a Precious Soul - 3 (246)
  141. processNoblesseQuest(player, 246, preciousSoul3ItemIds);
  142. // Possessor of a Precious Soul - 4 (247)
  143. processNoblesseQuest(player, 247, null);
  144. // Take the Territory Badges.
  145. player.destroyItemByItemId(event, itemId, TerritoryWarManager.MINTWBADGEFORNOBLESS, npc, true);
  146. // Give Noblesse Tiara to the player.
  147. player.addItem(event, 7694, 1, npc, true);
  148. // Set Noblesse status to the player.
  149. player.setNoble(true);
  150. player.sendPacket(new UserInfo(player));
  151. player.sendPacket(new ExBrExtraUserInfo(player));
  152. // Complete the sub-class related quest.
  153. // Complete quest Seeds of Chaos (236) for Kamael characters.
  154. // Complete quest Mimir's Elixir (235) for other races characters.
  155. final Quest q = QuestManager.getInstance().getQuest((player.getRace() == Race.KAMAEL) ? 236 : 235);
  156. if (q != null)
  157. {
  158. QuestState qs = player.getQuestState(q.getName());
  159. if (qs == null)
  160. {
  161. qs = q.newQuestState(player);
  162. qs.setState(State.STARTED);
  163. }
  164. // Completes the quest.
  165. qs.exitQuest(false);
  166. }
  167. // Remove the following items
  168. // Caradine's Letter
  169. deleteIfExist(player, 7678, event, npc);
  170. // Caradine's Letter
  171. deleteIfExist(player, 7679, event, npc);
  172. // Star of Destiny
  173. deleteIfExist(player, 5011, event, npc);
  174. // Virgil's Letter
  175. deleteIfExist(player, 1239, event, npc);
  176. // Arkenia's Letter
  177. deleteIfExist(player, 1246, event, npc);
  178. }
  179. break;
  180. }
  181. case "CalcRewards":
  182. {
  183. final int[] reward = TerritoryWarManager.getInstance().calcReward(player);
  184. final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
  185. final String prefix = player.getHtmlPrefix();
  186. if (TerritoryWarManager.getInstance().isTWInProgress() || (reward[0] == 0))
  187. {
  188. html.setFile(prefix, "data/scripts/ai/npc/TerritoryManagers/reward-0a.html");
  189. }
  190. else if (reward[0] != territoryId)
  191. {
  192. html.setFile(prefix, "data/scripts/ai/npc/TerritoryManagers/reward-0b.html");
  193. html.replace("%castle%", CastleManager.getInstance().getCastleById(reward[0] - 80).getName());
  194. }
  195. else if (reward[1] == 0)
  196. {
  197. html.setFile(prefix, "data/scripts/ai/npc/TerritoryManagers/reward-0a.html");
  198. }
  199. else
  200. {
  201. html.setFile(prefix, "data/scripts/ai/npc/TerritoryManagers/reward-1.html");
  202. html.replace("%castle%", CastleManager.getInstance().getCastleById(reward[0] - 80).getName());
  203. html.replace("%badge%", String.valueOf(reward[1]));
  204. html.replace("%adena%", String.valueOf(reward[1] * 5000));
  205. }
  206. html.replace("%territoryId%", String.valueOf(territoryId));
  207. html.replace("%objectId%", String.valueOf(npc.getObjectId()));
  208. player.sendPacket(html);
  209. player.sendPacket(ActionFailed.STATIC_PACKET);
  210. break;
  211. }
  212. case "ReceiveRewards":
  213. {
  214. int badgeId = 57;
  215. if (TerritoryWarManager.TERRITORY_ITEM_IDS.containsKey(territoryId))
  216. {
  217. badgeId = TerritoryWarManager.TERRITORY_ITEM_IDS.get(territoryId);
  218. }
  219. int[] reward = TerritoryWarManager.getInstance().calcReward(player);
  220. final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
  221. if (TerritoryWarManager.getInstance().isTWInProgress() || (reward[0] == 0))
  222. {
  223. html.setFile(player.getHtmlPrefix(), "data/scripts/ai/npc/TerritoryManagers/reward-0a.html");
  224. }
  225. else if (reward[0] != territoryId)
  226. {
  227. html.setFile(player.getHtmlPrefix(), "data/scripts/ai/npc/TerritoryManagers/reward-0b.html");
  228. html.replace("%castle%", CastleManager.getInstance().getCastleById(reward[0] - 80).getName());
  229. }
  230. else if (reward[1] == 0)
  231. {
  232. html.setFile(player.getHtmlPrefix(), "data/scripts/ai/npc/TerritoryManagers/reward-0a.html");
  233. }
  234. else
  235. {
  236. html.setFile(player.getHtmlPrefix(), "data/scripts/ai/npc/TerritoryManagers/reward-2.html");
  237. player.addItem("ReceiveRewards", badgeId, reward[1], npc, true);
  238. player.addAdena("ReceiveRewards", reward[1] * 5000, npc, true);
  239. TerritoryWarManager.getInstance().resetReward(player);
  240. }
  241. html.replace("%objectId%", String.valueOf(npc.getObjectId()));
  242. player.sendPacket(html);
  243. player.sendPacket(ActionFailed.STATIC_PACKET);
  244. break;
  245. }
  246. default:
  247. {
  248. htmltext = event;
  249. break;
  250. }
  251. }
  252. return htmltext;
  253. }
  254. /**
  255. * Complete the following quests and delete its quest specific items.
  256. * @param player the active player that will be processed
  257. * @param questId the quest Id of the quest that will be processed
  258. * @param itemIds the item Ids should be deleted
  259. */
  260. private static void processNoblesseQuest(L2PcInstance player, int questId, int[] itemIds)
  261. {
  262. final Quest q = QuestManager.getInstance().getQuest(questId);
  263. if (q == null)
  264. {
  265. return;
  266. }
  267. QuestState qs = player.getQuestState(q.getName());
  268. if (qs == null)
  269. {
  270. qs = q.newQuestState(player);
  271. qs.setState(State.STARTED);
  272. }
  273. if (!qs.isCompleted())
  274. {
  275. // Take the quest specific items.
  276. if (itemIds != null)
  277. {
  278. for (int itemId : itemIds)
  279. {
  280. takeItems(player, itemId, -1);
  281. }
  282. }
  283. // Completes the quest.
  284. qs.exitQuest(false);
  285. }
  286. }
  287. /**
  288. * Deletes the item if exists.
  289. * @param player the player owner of the item that must be deleted
  290. * @param itemId the item Id of the item that must be deleted
  291. * @param event the event leading to this deletion
  292. * @param npc the npc referencing this deletion
  293. */
  294. private static void deleteIfExist(L2PcInstance player, int itemId, String event, L2Npc npc)
  295. {
  296. final L2ItemInstance item = player.getInventory().getItemByItemId(itemId);
  297. if (item != null)
  298. {
  299. player.destroyItem(event, item, npc, true);
  300. }
  301. }
  302. public static void main(String[] args)
  303. {
  304. new TerritoryManagers();
  305. }
  306. }