Scrolls.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.handler.itemhandlers;
  16. import net.sf.l2j.gameserver.datatables.SkillTable;
  17. import net.sf.l2j.gameserver.handler.IItemHandler;
  18. import net.sf.l2j.gameserver.model.L2ItemInstance;
  19. import net.sf.l2j.gameserver.model.L2Skill;
  20. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  21. import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
  22. import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
  23. import net.sf.l2j.gameserver.model.entity.TvTEvent;
  24. import net.sf.l2j.gameserver.network.SystemMessageId;
  25. import net.sf.l2j.gameserver.serverpackets.ActionFailed;
  26. import net.sf.l2j.gameserver.serverpackets.MagicSkillUse;
  27. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  28. /**
  29. * This class ...
  30. *
  31. * @version $Revision: 1.1.6.4 $ $Date: 2005/04/06 18:25:18 $
  32. */
  33. public class Scrolls implements IItemHandler
  34. {
  35. private static final int[] ITEM_IDS = { 3926, 3927, 3928, 3929, 3930, 3931, 3932,
  36. 3933, 3934, 3935, 4218, 5593, 5594, 5595, 6037,
  37. 5703, 5803, 5804, 5805, 5806, 5807, // lucky charm
  38. 8515, 8516, 8517, 8518, 8519, 8520, // charm of courage
  39. 8594, 8595, 8596, 8597, 8598, 8599, // scrolls of recovery
  40. 8954, 8955, 8956, // primeval crystal
  41. 9146, 9147, 9148, 9149, 9150, 9151, 9152, 9153, 9154, 9155,
  42. 9897, 10131, 10132, 10133, 10134, 10135, 10136, 10137, 10138, 10151, 10274 // transformation scrolls
  43. };
  44. public void useItem(L2PlayableInstance playable, L2ItemInstance item)
  45. {
  46. L2PcInstance activeChar;
  47. if (playable instanceof L2PcInstance)
  48. activeChar = (L2PcInstance)playable;
  49. else if (playable instanceof L2PetInstance)
  50. activeChar = ((L2PetInstance)playable).getOwner();
  51. else
  52. return;
  53. if (activeChar.isAllSkillsDisabled())
  54. {
  55. activeChar.sendPacket(ActionFailed.STATIC_PACKET);
  56. return;
  57. }
  58. if (activeChar.isInOlympiadMode())
  59. {
  60. activeChar.sendPacket(new SystemMessage(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT));
  61. return;
  62. }
  63. if (!TvTEvent.onScrollUse(playable.getObjectId()))
  64. {
  65. playable.sendPacket(ActionFailed.STATIC_PACKET);
  66. return;
  67. }
  68. int itemId = item.getItemId();
  69. if (itemId >= 8594 && itemId <= 8599) //Scrolls of recovery XML: 2286
  70. {
  71. if (activeChar.getKarma() > 0) return; // Chaotic can not use it
  72. byte expIndex = (byte)activeChar.getExpertiseIndex();
  73. if ((itemId == 8594 && expIndex==0) || // Scroll: Recovery (No Grade)
  74. (itemId == 8595 && expIndex==1) || // Scroll: Recovery (D Grade)
  75. (itemId == 8596 && expIndex==2) || // Scroll: Recovery (C Grade)
  76. (itemId == 8597 && expIndex==3) || // Scroll: Recovery (B Grade)
  77. (itemId == 8598 && expIndex==4) || // Scroll: Recovery (A Grade)
  78. (itemId == 8599 && (expIndex==5 || expIndex==6))) // Scroll: Recovery (S/80 Grade)
  79. {
  80. if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
  81. return;
  82. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2286, 1, 1, 0));
  83. activeChar.reduceDeathPenaltyBuffLevel();
  84. useScroll(activeChar, 2286, itemId - 8593);
  85. }
  86. else
  87. activeChar.sendPacket(new SystemMessage(SystemMessageId.INCOMPATIBLE_ITEM_GRADE));
  88. return;
  89. }
  90. else if (itemId == 5703 || itemId >= 5803 && itemId <= 5807)
  91. {
  92. byte expIndex = (byte)activeChar.getExpertiseIndex();
  93. if ((itemId == 5703 && expIndex==0) || // Lucky Charm (No Grade)
  94. (itemId == 5803 && expIndex==1) || // Lucky Charm (D Grade)
  95. (itemId == 5804 && expIndex==2) || // Lucky Charm (C Grade)
  96. (itemId == 5805 && expIndex==3) || // Lucky Charm (B Grade)
  97. (itemId == 5806 && expIndex==4) || // Lucky Charm (A Grade)
  98. (itemId == 5807 && (expIndex==5 || expIndex==6))) // Lucky Charm (S/80 Grade)
  99. {
  100. if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
  101. return;
  102. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2168, (expIndex>5? expIndex : expIndex+1), 1, 0));
  103. useScroll(activeChar, 2168, (expIndex>5? expIndex : expIndex+1));
  104. activeChar.setCharmOfLuck(true);
  105. }
  106. else
  107. activeChar.sendPacket(new SystemMessage(SystemMessageId.INCOMPATIBLE_ITEM_GRADE));
  108. return;
  109. }
  110. else if (itemId >= 8515 && itemId <= 8520) // Charm of Courage XML: 5041
  111. {
  112. byte expIndex = (byte)activeChar.getExpertiseIndex();
  113. if ((itemId == 8515 && expIndex == 0) || // Charm of Courage (No Grade)
  114. (itemId == 8516 && expIndex <= 1) || // Charm of Courage (D Grade)
  115. (itemId == 8517 && expIndex <= 2) || // Charm of Courage (C Grade)
  116. (itemId == 8518 && expIndex <= 3) || // Charm of Courage (B Grade)
  117. (itemId == 8519 && expIndex <= 4) || // Charm of Courage (A Grade)
  118. (itemId == 8520 && expIndex <= 6)) // Charm of Courage (S/80 Grade)
  119. {
  120. if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
  121. return;
  122. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 5041, 1, 1, 0));
  123. useScroll(activeChar, 5041, 1);
  124. }
  125. else
  126. activeChar.sendPacket(new SystemMessage(SystemMessageId.INCOMPATIBLE_ITEM_GRADE));
  127. return;
  128. }
  129. else if (itemId == 9897||itemId>=10131 &&itemId <=10138||itemId == 10151||itemId == 10274) //transformation scrolls
  130. {
  131. if (activeChar.isMounted() || activeChar.getPet() != null || activeChar.isTransformed())
  132. {
  133. activeChar.sendPacket(new SystemMessage(SystemMessageId.S1_CANNOT_BE_USED).addItemName(item));
  134. return;
  135. }
  136. }
  137. else if (itemId >= 8954 && itemId <= 8956)
  138. {
  139. if (activeChar.getLevel() < 76)
  140. return;
  141. if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
  142. return;
  143. switch(itemId)
  144. {
  145. case 8954: // Blue Primeval Crystal XML: 2306
  146. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2306, 1, 1, 0));
  147. useScroll(activeChar, 2306, 1);
  148. break;
  149. case 8955: // Green Primeval Crystal XML: 2306
  150. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2306, 2, 1, 0));
  151. useScroll(activeChar, 2306, 2);
  152. break;
  153. case 8956: // Red Primeval Crystal XML: 2306
  154. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2306, 3, 1, 0));
  155. useScroll(activeChar, 2306, 3);
  156. break;
  157. default:
  158. break;
  159. }
  160. return;
  161. }
  162. // for the rest, there are no extra conditions
  163. if (!playable.destroyItem("Consume", item.getObjectId(), 1, null, false))
  164. return;
  165. switch(itemId)
  166. {
  167. case 3926: // Scroll of Guidance XML:2050
  168. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2050, 1, 1, 0));
  169. useScroll(activeChar, 2050, 1);
  170. break;
  171. case 3927: // Scroll of Death Whisper XML:2051
  172. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2051, 1, 1, 0));
  173. useScroll(activeChar, 2051, 1);
  174. break;
  175. case 3928: // Scroll of Focus XML:2052
  176. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2052, 1, 1, 0));
  177. useScroll(activeChar, 2052, 1);
  178. break;
  179. case 3929: // Scroll of Greater Acumen XML:2053
  180. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2053, 1, 1, 0));
  181. useScroll(activeChar, 2053, 1);
  182. break;
  183. case 3930: // Scroll of Haste XML:2054
  184. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2054, 1, 1, 0));
  185. useScroll(activeChar, 2054, 1);
  186. break;
  187. case 3931: // Scroll of Agility XML:2055
  188. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2055, 1, 1, 0));
  189. useScroll(activeChar, 2055, 1);
  190. break;
  191. case 3932: // Scroll of Mystic Empower XML:2056
  192. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2056, 1, 1, 0));
  193. useScroll(activeChar, 2056, 1);
  194. break;
  195. case 3933: // Scroll of Might XML:2057
  196. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2057, 1, 1, 0));
  197. useScroll(activeChar, 2057, 1);
  198. break;
  199. case 3934: // Scroll of Wind Walk XML:2058
  200. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2058, 1, 1, 0));
  201. useScroll(activeChar, 2058, 1);
  202. break;
  203. case 3935: // Scroll of Shield XML:2059
  204. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2059, 1, 1, 0));
  205. useScroll(activeChar, 2059, 1);
  206. break;
  207. case 4218: // Scroll of Mana Regeneration XML:2064
  208. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2064, 1, 1, 0));
  209. useScroll(activeChar, 2064, 1);
  210. break;
  211. case 5593: // SP Scroll Low Grade XML:2167
  212. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2167, 1, 1, 0));
  213. useScroll(activeChar, 2167, 1);
  214. break;
  215. case 5594: // SP Scroll Medium Grade XML:2167
  216. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2167, 2, 1, 0));
  217. useScroll(activeChar, 2167, 2);
  218. break;
  219. case 5595: // SP Scroll High Grade XML:2167
  220. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2167, 3, 1, 0));
  221. useScroll(activeChar, 2167, 3);
  222. break;
  223. case 6037: // Scroll of Waking XML:2170
  224. activeChar.broadcastPacket(new MagicSkillUse(playable, playable, 2170, 1, 1, 0));
  225. useScroll(activeChar, 2170, 1);
  226. break;
  227. case 9146: // Scroll of Guidance - For Event XML:2050
  228. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2050, 1, 1, 0));
  229. useScroll(activeChar, 2050, 1);
  230. break;
  231. case 9147: // Scroll of Death Whisper - For Event XML:2051
  232. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2051, 1, 1, 0));
  233. useScroll(activeChar, 2051, 1);
  234. break;
  235. case 9148: // Scroll of Focus - For Event XML:2052
  236. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2052, 1, 1, 0));
  237. useScroll(activeChar, 2052, 1);
  238. break;
  239. case 9149: // Scroll of Acumen - For Event XML:2053
  240. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2053, 1, 1, 0));
  241. useScroll(activeChar, 2053, 1);
  242. break;
  243. case 9150: // Scroll of Haste - For Event XML:2054
  244. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2054, 1, 1, 0));
  245. useScroll(activeChar, 2054, 1);
  246. break;
  247. case 9151: // Scroll of Agility - For Event XML:2055
  248. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2055, 1, 1, 0));
  249. useScroll(activeChar, 2055, 1);
  250. break;
  251. case 9152: // Scroll of Empower - For Event XML:2056
  252. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2056, 1, 1, 0));
  253. useScroll(activeChar, 2056, 1);
  254. break;
  255. case 9153: // Scroll of Might - For Event XML:2057
  256. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2057, 1, 1, 0));
  257. useScroll(activeChar, 2057, 1);
  258. break;
  259. case 9154: // Scroll of Wind Walk - For Event XML:2058
  260. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2058, 1, 1, 0));
  261. useScroll(activeChar, 2058, 1);
  262. break;
  263. case 9155: // Scroll of Shield - For Event XML:2059
  264. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2059, 1, 1, 0));
  265. useScroll(activeChar, 2059, 1);
  266. break;
  267. case 9897:
  268. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2370, 1, 1, 0));
  269. useScroll(activeChar, 2370, 1);
  270. break;
  271. case 9648:
  272. case 10131:
  273. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2371, 1, 1, 0));
  274. useScroll(activeChar, 2371, 1);
  275. break;
  276. case 9649:
  277. case 10132:
  278. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2372, 1, 1, 0));
  279. useScroll(activeChar, 2372, 1);
  280. break;
  281. case 9650:
  282. case 10133:
  283. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2373, 1, 1, 0));
  284. useScroll(activeChar, 2373, 1);
  285. break;
  286. case 9651:
  287. case 10134:
  288. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2374, 1, 1, 0));
  289. useScroll(activeChar, 2374, 1);
  290. break;
  291. case 9652:
  292. case 10135:
  293. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2375, 1, 1, 0));
  294. useScroll(activeChar, 2375, 1);
  295. break;
  296. case 9653:
  297. case 10136:
  298. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2376, 1, 1, 0));
  299. useScroll(activeChar, 2376, 1);
  300. break;
  301. case 9654:
  302. case 10137:
  303. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2377, 1, 1, 0));
  304. useScroll(activeChar, 2377, 1);
  305. break;
  306. case 9655:
  307. case 10138:
  308. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2378, 1, 1, 0));
  309. useScroll(activeChar, 2378, 1);
  310. break;
  311. case 10151:
  312. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2394, 1, 1, 0));
  313. useScroll(activeChar, 2394, 1);
  314. break;
  315. case 10274:
  316. activeChar.broadcastPacket(new MagicSkillUse(playable, activeChar, 2428, 1, 1, 0));
  317. useScroll(activeChar, 2428, 1);
  318. break;
  319. default:
  320. break;
  321. }
  322. }
  323. public void useScroll(L2PcInstance activeChar, int magicId,int level)
  324. {
  325. L2Skill skill = SkillTable.getInstance().getInfo(magicId,level);
  326. if (skill != null)
  327. activeChar.doCast(skill);
  328. }
  329. public int[] getItemIds()
  330. {
  331. return ITEM_IDS;
  332. }
  333. }