UseItem.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /*
  2. * Copyright (C) 2004-2015 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server 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 Server 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 com.l2jserver.gameserver.network.clientpackets;
  20. import java.util.logging.Level;
  21. import com.l2jserver.Config;
  22. import com.l2jserver.gameserver.ThreadPoolManager;
  23. import com.l2jserver.gameserver.ai.CtrlEvent;
  24. import com.l2jserver.gameserver.ai.CtrlIntention;
  25. import com.l2jserver.gameserver.ai.NextAction;
  26. import com.l2jserver.gameserver.enums.PrivateStoreType;
  27. import com.l2jserver.gameserver.enums.Race;
  28. import com.l2jserver.gameserver.handler.IItemHandler;
  29. import com.l2jserver.gameserver.handler.ItemHandler;
  30. import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
  31. import com.l2jserver.gameserver.model.PcCondOverride;
  32. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  33. import com.l2jserver.gameserver.model.effects.L2EffectType;
  34. import com.l2jserver.gameserver.model.holders.SkillHolder;
  35. import com.l2jserver.gameserver.model.itemcontainer.Inventory;
  36. import com.l2jserver.gameserver.model.items.L2EtcItem;
  37. import com.l2jserver.gameserver.model.items.L2Item;
  38. import com.l2jserver.gameserver.model.items.L2Weapon;
  39. import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  40. import com.l2jserver.gameserver.model.items.type.ArmorType;
  41. import com.l2jserver.gameserver.model.items.type.WeaponType;
  42. import com.l2jserver.gameserver.model.skills.Skill;
  43. import com.l2jserver.gameserver.network.SystemMessageId;
  44. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  45. import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;
  46. import com.l2jserver.gameserver.network.serverpackets.ItemList;
  47. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  48. public final class UseItem extends L2GameClientPacket
  49. {
  50. private static final String _C__19_USEITEM = "[C] 19 UseItem";
  51. private int _objectId;
  52. private boolean _ctrlPressed;
  53. private int _itemId;
  54. /** Weapon Equip Task */
  55. private static class WeaponEquipTask implements Runnable
  56. {
  57. L2ItemInstance item;
  58. L2PcInstance activeChar;
  59. protected WeaponEquipTask(L2ItemInstance it, L2PcInstance character)
  60. {
  61. item = it;
  62. activeChar = character;
  63. }
  64. @Override
  65. public void run()
  66. {
  67. // If character is still engaged in strike we should not change weapon
  68. if (activeChar.isAttackingNow())
  69. {
  70. return;
  71. }
  72. // Equip or unEquip
  73. activeChar.useEquippableItem(item, false);
  74. }
  75. }
  76. @Override
  77. protected void readImpl()
  78. {
  79. _objectId = readD();
  80. _ctrlPressed = readD() != 0;
  81. }
  82. @Override
  83. protected void runImpl()
  84. {
  85. final L2PcInstance activeChar = getClient().getActiveChar();
  86. if (activeChar == null)
  87. {
  88. return;
  89. }
  90. if (Config.DEBUG)
  91. {
  92. _log.log(Level.INFO, activeChar + ": use item " + _objectId);
  93. }
  94. // Flood protect UseItem
  95. if (!getClient().getFloodProtectors().getUseItem().tryPerformAction("use item"))
  96. {
  97. return;
  98. }
  99. if (activeChar.getActiveTradeList() != null)
  100. {
  101. activeChar.cancelActiveTrade();
  102. }
  103. if (activeChar.getPrivateStoreType() != PrivateStoreType.NONE)
  104. {
  105. activeChar.sendPacket(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE);
  106. activeChar.sendPacket(ActionFailed.STATIC_PACKET);
  107. return;
  108. }
  109. final L2ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
  110. if (item == null)
  111. {
  112. return;
  113. }
  114. if (item.getItem().getType2() == L2Item.TYPE2_QUEST)
  115. {
  116. activeChar.sendPacket(SystemMessageId.CANNOT_USE_QUEST_ITEMS);
  117. return;
  118. }
  119. // No UseItem is allowed while the player is in special conditions
  120. if (activeChar.isStunned() || activeChar.isParalyzed() || activeChar.isSleeping() || activeChar.isAfraid() || activeChar.isAlikeDead())
  121. {
  122. return;
  123. }
  124. // Char cannot use item when dead
  125. if (activeChar.isDead() || !activeChar.getInventory().canManipulateWithItemId(item.getId()))
  126. {
  127. final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
  128. sm.addItemName(item);
  129. activeChar.sendPacket(sm);
  130. return;
  131. }
  132. if (!item.isEquipped() && !item.getItem().checkCondition(activeChar, activeChar, true))
  133. {
  134. return;
  135. }
  136. _itemId = item.getId();
  137. if (activeChar.isFishing() && ((_itemId < 6535) || (_itemId > 6540)))
  138. {
  139. // You cannot do anything else while fishing
  140. activeChar.sendPacket(SystemMessageId.CANNOT_DO_WHILE_FISHING_3);
  141. return;
  142. }
  143. if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT && (activeChar.getKarma() > 0))
  144. {
  145. SkillHolder[] skills = item.getItem().getSkills();
  146. if (skills != null)
  147. {
  148. for (SkillHolder sHolder : skills)
  149. {
  150. Skill skill = sHolder.getSkill();
  151. if ((skill != null) && skill.hasEffectType(L2EffectType.TELEPORT))
  152. {
  153. return;
  154. }
  155. }
  156. }
  157. }
  158. // If the item has reuse time and it has not passed.
  159. // Message from reuse delay must come from item.
  160. final int reuseDelay = item.getReuseDelay();
  161. final int sharedReuseGroup = item.getSharedReuseGroup();
  162. if (reuseDelay > 0)
  163. {
  164. final long reuse = activeChar.getItemRemainingReuseTime(item.getObjectId());
  165. if (reuse > 0)
  166. {
  167. reuseData(activeChar, item, reuse);
  168. sendSharedGroupUpdate(activeChar, sharedReuseGroup, reuse, reuseDelay);
  169. return;
  170. }
  171. final long reuseOnGroup = activeChar.getReuseDelayOnGroup(sharedReuseGroup);
  172. if (reuseOnGroup > 0)
  173. {
  174. reuseData(activeChar, item, reuseOnGroup);
  175. sendSharedGroupUpdate(activeChar, sharedReuseGroup, reuseOnGroup, reuseDelay);
  176. return;
  177. }
  178. }
  179. if (item.isEquipable())
  180. {
  181. // Don't allow to put formal wear while a cursed weapon is equipped.
  182. if (activeChar.isCursedWeaponEquipped() && (_itemId == 6408))
  183. {
  184. return;
  185. }
  186. // Equip or unEquip
  187. if (FortSiegeManager.getInstance().isCombat(_itemId))
  188. {
  189. return; // no message
  190. }
  191. if (activeChar.isCombatFlagEquipped())
  192. {
  193. return;
  194. }
  195. switch (item.getItem().getBodyPart())
  196. {
  197. case L2Item.SLOT_LR_HAND:
  198. case L2Item.SLOT_L_HAND:
  199. case L2Item.SLOT_R_HAND:
  200. {
  201. // Prevent players to equip weapon while wearing combat flag
  202. if ((activeChar.getActiveWeaponItem() != null) && (activeChar.getActiveWeaponItem().getId() == 9819))
  203. {
  204. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  205. return;
  206. }
  207. if (activeChar.isMounted())
  208. {
  209. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  210. return;
  211. }
  212. if (activeChar.isDisarmed())
  213. {
  214. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  215. return;
  216. }
  217. // Don't allow weapon/shield equipment if a cursed weapon is equipped.
  218. if (activeChar.isCursedWeaponEquipped())
  219. {
  220. return;
  221. }
  222. // Don't allow other Race to Wear Kamael exclusive Weapons.
  223. if (!item.isEquipped() && item.isWeapon() && !activeChar.canOverrideCond(PcCondOverride.ITEM_CONDITIONS))
  224. {
  225. L2Weapon wpn = (L2Weapon) item.getItem();
  226. switch (activeChar.getRace())
  227. {
  228. case KAMAEL:
  229. {
  230. switch (wpn.getItemType())
  231. {
  232. case NONE:
  233. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  234. return;
  235. }
  236. break;
  237. }
  238. case HUMAN:
  239. case DWARF:
  240. case ELF:
  241. case DARK_ELF:
  242. case ORC:
  243. {
  244. switch (wpn.getItemType())
  245. {
  246. case RAPIER:
  247. case CROSSBOW:
  248. case ANCIENTSWORD:
  249. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  250. return;
  251. }
  252. break;
  253. }
  254. }
  255. }
  256. break;
  257. }
  258. case L2Item.SLOT_CHEST:
  259. case L2Item.SLOT_BACK:
  260. case L2Item.SLOT_GLOVES:
  261. case L2Item.SLOT_FEET:
  262. case L2Item.SLOT_HEAD:
  263. case L2Item.SLOT_FULL_ARMOR:
  264. case L2Item.SLOT_LEGS:
  265. {
  266. if ((activeChar.getRace() == Race.KAMAEL) && ((item.getItem().getItemType() == ArmorType.HEAVY) || (item.getItem().getItemType() == ArmorType.MAGIC)))
  267. {
  268. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  269. return;
  270. }
  271. break;
  272. }
  273. case L2Item.SLOT_DECO:
  274. {
  275. if (!item.isEquipped() && (activeChar.getInventory().getTalismanSlots() == 0))
  276. {
  277. activeChar.sendPacket(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION);
  278. return;
  279. }
  280. }
  281. }
  282. if (activeChar.isCastingNow() || activeChar.isCastingSimultaneouslyNow())
  283. {
  284. // Creating next action class.
  285. final NextAction nextAction = new NextAction(CtrlEvent.EVT_FINISH_CASTING, CtrlIntention.AI_INTENTION_CAST, () -> activeChar.useEquippableItem(item, true));
  286. // Binding next action to AI.
  287. activeChar.getAI().setNextAction(nextAction);
  288. }
  289. else if (activeChar.isAttackingNow())
  290. {
  291. ThreadPoolManager.getInstance().scheduleGeneral(new WeaponEquipTask(item, activeChar), activeChar.getAttackEndTime() - System.currentTimeMillis());
  292. }
  293. else
  294. {
  295. activeChar.useEquippableItem(item, true);
  296. }
  297. }
  298. else
  299. {
  300. final L2Weapon weaponItem = activeChar.getActiveWeaponItem();
  301. if (((weaponItem != null) && (weaponItem.getItemType() == WeaponType.FISHINGROD)) && (((_itemId >= 6519) && (_itemId <= 6527)) || ((_itemId >= 7610) && (_itemId <= 7613)) || ((_itemId >= 7807) && (_itemId <= 7809)) || ((_itemId >= 8484) && (_itemId <= 8486)) || ((_itemId >= 8505) && (_itemId <= 8513))))
  302. {
  303. activeChar.getInventory().setPaperdollItem(Inventory.PAPERDOLL_LHAND, item);
  304. activeChar.broadcastUserInfo();
  305. // Send a Server->Client packet ItemList to this L2PcINstance to update left hand equipment.
  306. sendPacket(new ItemList(activeChar, false));
  307. return;
  308. }
  309. final L2EtcItem etcItem = item.getEtcItem();
  310. final IItemHandler handler = ItemHandler.getInstance().getHandler(etcItem);
  311. if (handler == null)
  312. {
  313. if ((etcItem != null) && (etcItem.getHandlerName() != null))
  314. {
  315. _log.log(Level.WARNING, "Unmanaged Item handler: " + etcItem.getHandlerName() + " for Item Id: " + _itemId + "!");
  316. }
  317. else if (Config.DEBUG)
  318. {
  319. _log.log(Level.WARNING, "No Item handler registered for Item Id: " + _itemId + "!");
  320. }
  321. return;
  322. }
  323. // Item reuse time should be added if the item is successfully used.
  324. // Skill reuse delay is done at handlers.itemhandlers.ItemSkillsTemplate;
  325. if (handler.useItem(activeChar, item, _ctrlPressed))
  326. {
  327. if (reuseDelay > 0)
  328. {
  329. activeChar.addTimeStampItem(item, reuseDelay);
  330. sendSharedGroupUpdate(activeChar, sharedReuseGroup, reuseDelay, reuseDelay);
  331. }
  332. }
  333. }
  334. }
  335. private void reuseData(L2PcInstance activeChar, L2ItemInstance item, long remainingTime)
  336. {
  337. final int hours = (int) (remainingTime / 3600000L);
  338. final int minutes = (int) (remainingTime % 3600000L) / 60000;
  339. final int seconds = (int) ((remainingTime / 1000) % 60);
  340. final SystemMessage sm;
  341. if (hours > 0)
  342. {
  343. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1);
  344. sm.addItemName(item);
  345. sm.addInt(hours);
  346. sm.addInt(minutes);
  347. }
  348. else if (minutes > 0)
  349. {
  350. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1);
  351. sm.addItemName(item);
  352. sm.addInt(minutes);
  353. }
  354. else
  355. {
  356. sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1);
  357. sm.addItemName(item);
  358. }
  359. sm.addInt(seconds);
  360. activeChar.sendPacket(sm);
  361. }
  362. private void sendSharedGroupUpdate(L2PcInstance activeChar, int group, long remaining, int reuse)
  363. {
  364. if (group > 0)
  365. {
  366. activeChar.sendPacket(new ExUseSharedGroupItem(_itemId, group, remaining, reuse));
  367. }
  368. }
  369. @Override
  370. public String getType()
  371. {
  372. return _C__19_USEITEM;
  373. }
  374. @Override
  375. protected boolean triggersOnActionRequest()
  376. {
  377. return !Config.SPAWN_PROTECTION_ALLOWED_ITEMS.contains(_itemId);
  378. }
  379. }