ItemSkillsTemplate.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 handlers.itemhandlers;
  16. import com.l2jserver.gameserver.ai.CtrlIntention;
  17. import com.l2jserver.gameserver.handler.IItemHandler;
  18. import com.l2jserver.gameserver.model.L2Skill;
  19. import com.l2jserver.gameserver.model.actor.L2Playable;
  20. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  21. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.TimeStamp;
  22. import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
  23. import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance;
  24. import com.l2jserver.gameserver.model.entity.TvTEvent;
  25. import com.l2jserver.gameserver.model.item.instance.L2ItemInstance;
  26. import com.l2jserver.gameserver.model.item.type.L2EtcItemType;
  27. import com.l2jserver.gameserver.network.SystemMessageId;
  28. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  29. import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;
  30. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  31. import com.l2jserver.gameserver.skills.SkillHolder;
  32. import com.l2jserver.gameserver.util.L2TIntObjectHashMap;
  33. /**
  34. * Template for item skills handler
  35. * Only minimum of checks
  36. */
  37. public class ItemSkillsTemplate implements IItemHandler
  38. {
  39. /**
  40. *
  41. * @see com.l2jserver.gameserver.handler.IItemHandler#useItem(com.l2jserver.gameserver.model.actor.L2Playable, com.l2jserver.gameserver.model.L2ItemInstance, boolean)
  42. */
  43. @Override
  44. public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
  45. {
  46. L2PcInstance activeChar;
  47. boolean isPet = playable instanceof L2PetInstance;
  48. if (isPet)
  49. activeChar = ((L2PetInstance) playable).getOwner();
  50. else if (playable instanceof L2PcInstance)
  51. activeChar = (L2PcInstance) playable;
  52. else
  53. return;
  54. if (!TvTEvent.onScrollUse(playable.getObjectId()))
  55. {
  56. playable.sendPacket(ActionFailed.STATIC_PACKET);
  57. return;
  58. }
  59. // pets can use items only when they are tradeable
  60. if (isPet && !item.isTradeable())
  61. {
  62. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ITEM_NOT_FOR_PETS));
  63. return;
  64. }
  65. int skillId;
  66. int skillLvl;
  67. final SkillHolder[] skills = item.getEtcItem().getSkills();
  68. if (skills != null)
  69. {
  70. for (SkillHolder skillInfo : skills)
  71. {
  72. if(skillInfo == null)
  73. continue;
  74. skillId = skillInfo.getSkillId();
  75. skillLvl = skillInfo.getSkillLvl();
  76. L2Skill itemSkill = skillInfo.getSkill();
  77. if (itemSkill != null)
  78. {
  79. if (!itemSkill.checkCondition(playable, playable.getTarget(), false))
  80. return;
  81. if (playable.isSkillDisabled(itemSkill))
  82. {
  83. reuse(activeChar,itemSkill, item);
  84. return ;
  85. }
  86. if (!itemSkill.isPotion() && playable.isCastingNow())
  87. {
  88. return;
  89. }
  90. if (itemSkill.getItemConsumeId() == 0 && itemSkill.getItemConsume() > 0 && (itemSkill.isPotion() || itemSkill.isSimultaneousCast()))
  91. {
  92. if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false))
  93. {
  94. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS));
  95. return;
  96. }
  97. }
  98. // send message to owner
  99. if (isPet)
  100. {
  101. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_USES_S1);
  102. sm.addString(itemSkill.getName());
  103. activeChar.sendPacket(sm);
  104. }
  105. else
  106. {
  107. switch (skillId)
  108. {
  109. // short buff icon for healing potions
  110. case 2031:
  111. case 2032:
  112. case 2037:
  113. case 26025:
  114. case 26026:
  115. int buffId = activeChar._shortBuffTaskSkillId;
  116. // greater healing potions
  117. if (skillId == 2037 || skillId == 26025)
  118. activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000);
  119. // healing potions
  120. else if ((skillId == 2032 || skillId == 26026) && buffId !=2037 && buffId != 26025)
  121. activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000);
  122. // lesser healing potions
  123. else
  124. {
  125. if (buffId != 2037 && buffId != 26025 && buffId != 2032 && buffId != 26026)
  126. activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000);
  127. }
  128. break;
  129. }
  130. }
  131. if (itemSkill.isPotion() || itemSkill.isSimultaneousCast())
  132. {
  133. playable.doSimultaneousCast(itemSkill);
  134. // Summons should be affected by herbs too, self time effect is handled at L2Effect constructor
  135. if (!isPet && item.getItemType() == L2EtcItemType.HERB
  136. && activeChar.getPet() != null
  137. && activeChar.getPet() instanceof L2SummonInstance)
  138. activeChar.getPet().doSimultaneousCast(itemSkill);
  139. }
  140. else
  141. {
  142. playable.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
  143. if (!playable.useMagic(itemSkill, forceUse, false))
  144. return;
  145. //consume
  146. if (itemSkill.getItemConsumeId() == 0 && itemSkill.getItemConsume() > 0)
  147. {
  148. if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false))
  149. {
  150. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS));
  151. return;
  152. }
  153. }
  154. }
  155. if (itemSkill.getReuseDelay() > 0)
  156. {
  157. activeChar.addTimeStamp(itemSkill, itemSkill.getReuseDelay());
  158. //activeChar.disableSkill(itemSkill, itemSkill.getReuseDelay());
  159. if (item.isEtcItem())
  160. {
  161. final int group = item.getEtcItem().getSharedReuseGroup();
  162. if (group >= 0)
  163. activeChar.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, itemSkill.getReuseDelay(), itemSkill.getReuseDelay()));
  164. }
  165. }
  166. }
  167. }
  168. }
  169. else
  170. _log.info("Item "+ item + " does not have registered any skill for handler.");
  171. }
  172. private void reuse(L2PcInstance player,L2Skill skill, L2ItemInstance item)
  173. {
  174. SystemMessage sm = null;
  175. final L2TIntObjectHashMap<TimeStamp> timeStamp = player.getReuseTimeStamp();
  176. if (timeStamp != null && timeStamp.containsKey(skill.getReuseHashCode()))
  177. {
  178. final long remainingTime = player.getReuseTimeStamp().get(skill.getReuseHashCode()).getRemaining();
  179. final int hours = (int)(remainingTime / 3600000L);
  180. final int minutes = (int)(remainingTime % 3600000L) / 60000;
  181. final int seconds = (int)(remainingTime / 1000 % 60);
  182. if (hours > 0)
  183. {
  184. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1);
  185. if (skill.isPotion())
  186. sm.addItemName(item);
  187. else
  188. sm.addSkillName(skill);
  189. sm.addNumber(hours);
  190. sm.addNumber(minutes);
  191. }
  192. else if (minutes > 0)
  193. {
  194. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1);
  195. if (skill.isPotion())
  196. sm.addItemName(item);
  197. else
  198. sm.addSkillName(skill);
  199. sm.addNumber(minutes);
  200. }
  201. else
  202. {
  203. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1);
  204. if (skill.isPotion())
  205. sm.addItemName(item);
  206. else
  207. sm.addSkillName(skill);
  208. }
  209. sm.addNumber(seconds);
  210. if (item.isEtcItem())
  211. {
  212. final int group = item.getEtcItem().getSharedReuseGroup();
  213. if (group >= 0)
  214. player.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, (int)remainingTime, skill.getReuseDelay()));
  215. }
  216. }
  217. else
  218. {
  219. sm = SystemMessage.getSystemMessage(SystemMessageId.S1_PREPARED_FOR_REUSE);
  220. sm.addItemName(item);
  221. }
  222. player.sendPacket(sm);
  223. }
  224. }