Q00103_SpiritOfCraftsman.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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 quests.Q00103_SpiritOfCraftsman;
  20. import quests.Q00281_HeadForTheHills.Q00281_HeadForTheHills;
  21. import com.l2jserver.gameserver.enums.Race;
  22. import com.l2jserver.gameserver.model.actor.L2Npc;
  23. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  24. import com.l2jserver.gameserver.model.holders.ItemHolder;
  25. import com.l2jserver.gameserver.model.quest.Quest;
  26. import com.l2jserver.gameserver.model.quest.QuestState;
  27. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  28. import com.l2jserver.gameserver.util.Util;
  29. /**
  30. * Spirit of Craftsman (103)
  31. * @author janiko
  32. */
  33. public final class Q00103_SpiritOfCraftsman extends Quest
  34. {
  35. // NPCs
  36. private static final int BLACKSMITH_KAROYD = 30307;
  37. private static final int CECON = 30132;
  38. private static final int HARNE = 30144;
  39. // Items
  40. private static final int KAROYDS_LETTER = 968;
  41. private static final int CECKTINONS_VOUCHER1 = 969;
  42. private static final int CECKTINONS_VOUCHER2 = 970;
  43. private static final int SOUL_CATCHER = 971;
  44. private static final int PRESERVE_OIL = 972;
  45. private static final int ZOMBIE_HEAD = 973;
  46. private static final int STEELBENDERS_HEAD = 974;
  47. private static final int BONE_FRAGMENT = 1107;
  48. // Monsters
  49. private static final int MARSH_ZOMBIE = 20015;
  50. private static final int DOOM_SOLDIER = 20455;
  51. private static final int SKELETON_HUNTER = 20517;
  52. private static final int SKELETON_HUNTER_ARCHER = 20518;
  53. // Rewards
  54. private static final int BLOODSABER = 975;
  55. private static final ItemHolder[] REWARDS =
  56. {
  57. new ItemHolder(1060, 100), // Lesser Healing Potion
  58. new ItemHolder(4412, 10), // Echo Crystal - Theme of Battle
  59. new ItemHolder(4413, 10), // Echo Crystal - Theme of Love
  60. new ItemHolder(4414, 10), // Echo Crystal - Theme of Solitude
  61. new ItemHolder(4415, 10), // Echo Crystal - Theme of Feast
  62. new ItemHolder(4416, 10), // Echo Crystal - Theme of Celebration
  63. };
  64. // Misc
  65. private static final int MIN_LVL = 10;
  66. public Q00103_SpiritOfCraftsman()
  67. {
  68. super(103, Q00103_SpiritOfCraftsman.class.getSimpleName(), "Spirit of Craftsman");
  69. addStartNpc(BLACKSMITH_KAROYD);
  70. addTalkId(BLACKSMITH_KAROYD, CECON, HARNE);
  71. addKillId(MARSH_ZOMBIE, DOOM_SOLDIER, SKELETON_HUNTER, SKELETON_HUNTER_ARCHER);
  72. registerQuestItems(KAROYDS_LETTER, CECKTINONS_VOUCHER1, CECKTINONS_VOUCHER2, SOUL_CATCHER, PRESERVE_OIL, ZOMBIE_HEAD, STEELBENDERS_HEAD, BONE_FRAGMENT);
  73. }
  74. @Override
  75. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  76. {
  77. final QuestState qs = getQuestState(player, false);
  78. String htmltext = null;
  79. if (qs == null)
  80. {
  81. return htmltext;
  82. }
  83. switch (event)
  84. {
  85. case "30307-04.htm":
  86. {
  87. htmltext = event;
  88. break;
  89. }
  90. case "30307-05.htm":
  91. {
  92. if (qs.isCreated())
  93. {
  94. qs.startQuest();
  95. giveItems(player, KAROYDS_LETTER, 1);
  96. htmltext = event;
  97. }
  98. break;
  99. }
  100. }
  101. return htmltext;
  102. }
  103. @Override
  104. public String onTalk(L2Npc npc, L2PcInstance talker)
  105. {
  106. final QuestState qs = getQuestState(talker, true);
  107. String htmltext = getNoQuestMsg(talker);
  108. switch (npc.getId())
  109. {
  110. case BLACKSMITH_KAROYD:
  111. {
  112. if (qs.isCreated())
  113. {
  114. if (talker.getRace() != Race.DARK_ELF)
  115. {
  116. htmltext = "30307-01.htm";
  117. }
  118. else if (talker.getLevel() < MIN_LVL)
  119. {
  120. htmltext = "30307-02.htm";
  121. }
  122. else
  123. {
  124. htmltext = "30307-03.htm";
  125. }
  126. }
  127. else if (qs.isStarted())
  128. {
  129. if (hasAtLeastOneQuestItem(talker, KAROYDS_LETTER, CECKTINONS_VOUCHER1, CECKTINONS_VOUCHER2))
  130. {
  131. htmltext = "30307-06.html";
  132. }
  133. else if (hasQuestItems(talker, STEELBENDERS_HEAD))
  134. {
  135. Q00281_HeadForTheHills.giveNewbieReward(talker);
  136. addExpAndSp(talker, 46663, 3999);
  137. giveAdena(talker, 19799, true);
  138. for (ItemHolder reward : REWARDS)
  139. {
  140. rewardItems(talker, reward);
  141. }
  142. rewardItems(talker, BLOODSABER, 1);
  143. qs.exitQuest(false, true);
  144. talker.sendPacket(new SocialAction(talker.getObjectId(), 3));
  145. htmltext = "30307-07.html";
  146. }
  147. }
  148. else if (qs.isCompleted())
  149. {
  150. htmltext = getAlreadyCompletedMsg(talker);
  151. break;
  152. }
  153. }
  154. case CECON:
  155. {
  156. if (qs.isStarted())
  157. {
  158. if (hasQuestItems(talker, KAROYDS_LETTER))
  159. {
  160. qs.setCond(2, true);
  161. takeItems(talker, KAROYDS_LETTER, 1);
  162. giveItems(talker, CECKTINONS_VOUCHER1, 1);
  163. htmltext = "30132-01.html";
  164. }
  165. else if (hasAtLeastOneQuestItem(talker, CECKTINONS_VOUCHER1, CECKTINONS_VOUCHER2))
  166. {
  167. htmltext = "30132-02.html";
  168. }
  169. else if (hasQuestItems(talker, SOUL_CATCHER))
  170. {
  171. qs.setCond(6, true);
  172. takeItems(talker, SOUL_CATCHER, 1);
  173. giveItems(talker, PRESERVE_OIL, 1);
  174. htmltext = "30132-03.html";
  175. }
  176. else if (hasQuestItems(talker, PRESERVE_OIL) && !hasQuestItems(talker, ZOMBIE_HEAD, STEELBENDERS_HEAD))
  177. {
  178. htmltext = "30132-04.html";
  179. }
  180. else if (hasQuestItems(talker, ZOMBIE_HEAD))
  181. {
  182. qs.setCond(8, true);
  183. takeItems(talker, ZOMBIE_HEAD, 1);
  184. giveItems(talker, STEELBENDERS_HEAD, 1);
  185. htmltext = "30132-05.html";
  186. }
  187. else if (hasQuestItems(talker, STEELBENDERS_HEAD))
  188. {
  189. htmltext = "30132-06.html";
  190. }
  191. }
  192. break;
  193. }
  194. case HARNE:
  195. {
  196. if (qs.isStarted())
  197. {
  198. if (hasQuestItems(talker, CECKTINONS_VOUCHER1))
  199. {
  200. qs.setCond(3, true);
  201. takeItems(talker, CECKTINONS_VOUCHER1, 1);
  202. giveItems(talker, CECKTINONS_VOUCHER2, 1);
  203. htmltext = "30144-01.html";
  204. }
  205. else if (hasQuestItems(talker, CECKTINONS_VOUCHER2))
  206. {
  207. if (getQuestItemsCount(talker, BONE_FRAGMENT) >= 10)
  208. {
  209. qs.setCond(5, true);
  210. takeItems(talker, CECKTINONS_VOUCHER2, 1);
  211. takeItems(talker, BONE_FRAGMENT, 10);
  212. giveItems(talker, SOUL_CATCHER, 1);
  213. htmltext = "30144-03.html";
  214. }
  215. else
  216. {
  217. htmltext = "30144-02.html";
  218. }
  219. }
  220. else if (hasQuestItems(talker, SOUL_CATCHER))
  221. {
  222. htmltext = "30144-04.html";
  223. }
  224. }
  225. break;
  226. }
  227. }
  228. return htmltext;
  229. }
  230. @Override
  231. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  232. {
  233. final QuestState qs = getRandomPartyMemberState(killer, -1, 3, npc);
  234. if (qs == null)
  235. {
  236. return super.onKill(npc, killer, isSummon);
  237. }
  238. switch (npc.getId())
  239. {
  240. case MARSH_ZOMBIE:
  241. {
  242. if (hasQuestItems(killer, PRESERVE_OIL) && (getRandom(10) < 5) && Util.checkIfInRange(1500, npc, killer, true))
  243. {
  244. giveItems(killer, ZOMBIE_HEAD, 1);
  245. takeItems(killer, PRESERVE_OIL, -1);
  246. qs.setCond(7, true);
  247. }
  248. break;
  249. }
  250. case DOOM_SOLDIER:
  251. case SKELETON_HUNTER:
  252. case SKELETON_HUNTER_ARCHER:
  253. {
  254. if (hasQuestItems(killer, CECKTINONS_VOUCHER2) && giveItemRandomly(qs.getPlayer(), npc, BONE_FRAGMENT, 1, 10, 1.0, true))
  255. {
  256. qs.setCond(4, true);
  257. }
  258. break;
  259. }
  260. }
  261. return super.onKill(npc, killer, isSummon);
  262. }
  263. }