HealerTrainer.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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.Trainers.HealerTrainer;
  20. import java.util.Collection;
  21. import ai.npc.AbstractNpcAI;
  22. import com.l2jserver.Config;
  23. import com.l2jserver.gameserver.data.xml.impl.SkillTreesData;
  24. import com.l2jserver.gameserver.datatables.SkillData;
  25. import com.l2jserver.gameserver.model.L2SkillLearn;
  26. import com.l2jserver.gameserver.model.actor.L2Npc;
  27. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  28. import com.l2jserver.gameserver.model.base.AcquireSkillType;
  29. import com.l2jserver.gameserver.model.holders.ItemHolder;
  30. import com.l2jserver.gameserver.model.skills.Skill;
  31. import com.l2jserver.gameserver.network.SystemMessageId;
  32. import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
  33. /**
  34. * Trainer healers AI.
  35. * @author Zoey76
  36. */
  37. public final class HealerTrainer extends AbstractNpcAI
  38. {
  39. // NPC
  40. // @formatter:off
  41. private static final int[] HEALER_TRAINERS =
  42. {
  43. 30022, 30030, 30032, 30036, 30067, 30068, 30116, 30117, 30118, 30119,
  44. 30144, 30145, 30188, 30194, 30293, 30330, 30375, 30377, 30464, 30473,
  45. 30476, 30680, 30701, 30720, 30721, 30858, 30859, 30860, 30861, 30864,
  46. 30906, 30908, 30912, 31280, 31281, 31287, 31329, 31330, 31335, 31969,
  47. 31970, 31976, 32155, 32162
  48. };
  49. // @formatter:on
  50. // Misc
  51. private static final int MIN_LEVEL = 76;
  52. private static final int MIN_CLASS_LEVEL = 3;
  53. private HealerTrainer()
  54. {
  55. super(HealerTrainer.class.getSimpleName(), "ai/npc/Trainers");
  56. addStartNpc(HEALER_TRAINERS);
  57. addTalkId(HEALER_TRAINERS);
  58. addFirstTalkId(HEALER_TRAINERS);
  59. }
  60. @Override
  61. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  62. {
  63. String htmltext = null;
  64. switch (event)
  65. {
  66. case "30864.html":
  67. case "30864-1.html":
  68. {
  69. htmltext = event;
  70. break;
  71. }
  72. case "SkillTransfer":
  73. {
  74. htmltext = "main.html";
  75. break;
  76. }
  77. case "SkillTransferLearn":
  78. {
  79. if (!npc.getTemplate().canTeach(player.getClassId()))
  80. {
  81. htmltext = npc.getId() + "-noteach.html";
  82. break;
  83. }
  84. if ((player.getLevel() < MIN_LEVEL) || (player.getClassId().level() < MIN_CLASS_LEVEL))
  85. {
  86. htmltext = "learn-lowlevel.html";
  87. break;
  88. }
  89. final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.TRANSFER);
  90. int count = 0;
  91. for (L2SkillLearn skillLearn : SkillTreesData.getInstance().getAvailableTransferSkills(player))
  92. {
  93. if (SkillData.getInstance().getSkill(skillLearn.getSkillId(), skillLearn.getSkillLevel()) != null)
  94. {
  95. count++;
  96. asl.addSkill(skillLearn.getSkillId(), skillLearn.getSkillLevel(), skillLearn.getSkillLevel(), skillLearn.getLevelUpSp(), 0);
  97. }
  98. }
  99. if (count > 0)
  100. {
  101. player.sendPacket(asl);
  102. }
  103. else
  104. {
  105. player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
  106. }
  107. break;
  108. }
  109. case "SkillTransferCleanse":
  110. {
  111. if (!npc.getTemplate().canTeach(player.getClassId()))
  112. {
  113. htmltext = "cleanse-no.html";
  114. break;
  115. }
  116. if ((player.getLevel() < MIN_LEVEL) || (player.getClassId().level() < MIN_CLASS_LEVEL))
  117. {
  118. htmltext = "cleanse-no.html";
  119. break;
  120. }
  121. if (player.getAdena() < Config.FEE_DELETE_TRANSFER_SKILLS)
  122. {
  123. player.sendPacket(SystemMessageId.CANNOT_RESET_SKILL_LINK_BECAUSE_NOT_ENOUGH_ADENA);
  124. break;
  125. }
  126. if (hasTransferSkillItems(player))
  127. {
  128. // Come back when you have used all transfer skill items for this class.
  129. htmltext = "cleanse-no_skills.html";
  130. }
  131. else
  132. {
  133. boolean hasSkills = false;
  134. final Collection<L2SkillLearn> skills = SkillTreesData.getInstance().getTransferSkillTree(player.getClassId()).values();
  135. for (L2SkillLearn skillLearn : skills)
  136. {
  137. final Skill skill = player.getKnownSkill(skillLearn.getSkillId());
  138. if (skill != null)
  139. {
  140. player.removeSkill(skill);
  141. for (ItemHolder item : skillLearn.getRequiredItems())
  142. {
  143. player.addItem("Cleanse", item.getId(), item.getCount(), npc, true);
  144. }
  145. hasSkills = true;
  146. }
  147. }
  148. // Adena gets reduced once.
  149. if (hasSkills)
  150. {
  151. player.reduceAdena("Cleanse", Config.FEE_DELETE_TRANSFER_SKILLS, npc, true);
  152. }
  153. }
  154. break;
  155. }
  156. }
  157. return htmltext;
  158. }
  159. /**
  160. * Verify if the player has the required item.
  161. * @param player the player to verify
  162. * @return {@code true} if the player has the item for the current class, {@code false} otherwise
  163. */
  164. private static boolean hasTransferSkillItems(L2PcInstance player)
  165. {
  166. int itemId;
  167. switch (player.getClassId())
  168. {
  169. case cardinal:
  170. {
  171. itemId = 15307;
  172. break;
  173. }
  174. case evaSaint:
  175. {
  176. itemId = 15308;
  177. break;
  178. }
  179. case shillienSaint:
  180. {
  181. itemId = 15309;
  182. break;
  183. }
  184. default:
  185. {
  186. itemId = -1;
  187. }
  188. }
  189. return (player.getInventory().getInventoryItemCount(itemId, -1) > 0);
  190. }
  191. public static void main(String[] args)
  192. {
  193. new HealerTrainer();
  194. }
  195. }