UseItem.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  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 com.l2jserver.gameserver.network.clientpackets;
  16. import java.util.logging.Logger;
  17. import com.l2jserver.Config;
  18. import com.l2jserver.gameserver.GameTimeController;
  19. import com.l2jserver.gameserver.ThreadPoolManager;
  20. import com.l2jserver.gameserver.handler.IItemHandler;
  21. import com.l2jserver.gameserver.handler.ItemHandler;
  22. import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
  23. import com.l2jserver.gameserver.model.L2ItemInstance;
  24. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  25. import com.l2jserver.gameserver.model.base.Race;
  26. import com.l2jserver.gameserver.model.itemcontainer.Inventory;
  27. import com.l2jserver.gameserver.network.SystemMessageId;
  28. import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  29. import com.l2jserver.gameserver.network.serverpackets.ItemList;
  30. import com.l2jserver.gameserver.network.serverpackets.ShowCalculator;
  31. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  32. import com.l2jserver.gameserver.templates.item.L2ArmorType;
  33. import com.l2jserver.gameserver.templates.item.L2Item;
  34. import com.l2jserver.gameserver.templates.item.L2Weapon;
  35. import com.l2jserver.gameserver.templates.item.L2WeaponType;
  36. /**
  37. * This class ...
  38. *
  39. * @version $Revision: 1.18.2.7.2.9 $ $Date: 2005/03/27 15:29:30 $
  40. */
  41. public final class UseItem extends L2GameClientPacket
  42. {
  43. private static Logger _log = Logger.getLogger(UseItem.class.getName());
  44. private static final String _C__14_USEITEM = "[C] 14 UseItem";
  45. private int _objectId;
  46. private boolean _ctrlPressed;
  47. private int _itemId;
  48. /** Weapon Equip Task */
  49. public static class WeaponEquipTask implements Runnable
  50. {
  51. L2ItemInstance item;
  52. L2PcInstance activeChar;
  53. public WeaponEquipTask(L2ItemInstance it, L2PcInstance character){
  54. item = it;
  55. activeChar = character;
  56. }
  57. public void run()
  58. {
  59. //If character is still engaged in strike we should not change weapon
  60. if (activeChar.isAttackingNow())
  61. return;
  62. // Equip or unEquip
  63. activeChar.useEquippableItem(item, false);
  64. }
  65. }
  66. @Override
  67. protected void readImpl()
  68. {
  69. _objectId = readD();
  70. _ctrlPressed = readD() != 0;
  71. }
  72. @Override
  73. protected void runImpl()
  74. {
  75. L2PcInstance activeChar = getClient().getActiveChar();
  76. if (activeChar == null)
  77. return;
  78. // Flood protect UseItem
  79. if (!getClient().getFloodProtectors().getUseItem().tryPerformAction("use item"))
  80. return;
  81. if (activeChar.getPrivateStoreType() != 0)
  82. {
  83. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE));
  84. activeChar.sendPacket(ActionFailed.STATIC_PACKET);
  85. return;
  86. }
  87. if (activeChar.getActiveTradeList() != null)
  88. activeChar.cancelActiveTrade();
  89. // cannot use items during Fear (possible more abnormal states?)
  90. if (activeChar.isAfraid())
  91. {
  92. // no sysmsg
  93. activeChar.sendPacket(ActionFailed.STATIC_PACKET);
  94. return;
  95. }
  96. // NOTE: disabled due to deadlocks
  97. // synchronized (activeChar.getInventory())
  98. // {
  99. L2ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
  100. if (item == null)
  101. return;
  102. if (item.getItem().getType2() == L2Item.TYPE2_QUEST)
  103. {
  104. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CANNOT_USE_QUEST_ITEMS);
  105. activeChar.sendPacket(sm);
  106. sm = null;
  107. return;
  108. }
  109. _itemId = item.getItemId();
  110. /*
  111. * Alt game - Karma punishment // SOE
  112. * 736 Scroll of Escape
  113. * 1538 Blessed Scroll of Escape
  114. * 1829 Scroll of Escape: Clan Hall
  115. * 1830 Scroll of Escape: Castle
  116. * 3958 L2Day - Blessed Scroll of Escape
  117. * 5858 Blessed Scroll of Escape: Clan Hall
  118. * 5859 Blessed Scroll of Escape: Castle
  119. * 6663 Scroll of Escape: Orc Village
  120. * 6664 Scroll of Escape: Silenos Village
  121. * 7117 Scroll of Escape to Talking Island
  122. * 7118 Scroll of Escape to Elven Village
  123. * 7119 Scroll of Escape to Dark Elf Village
  124. * 7120 Scroll of Escape to Orc Village
  125. * 7121 Scroll of Escape to Dwarven Village
  126. * 7122 Scroll of Escape to Gludin Village
  127. * 7123 Scroll of Escape to the Town of Gludio
  128. * 7124 Scroll of Escape to the Town of Dion
  129. * 7125 Scroll of Escape to Floran
  130. * 7126 Scroll of Escape to Giran Castle Town
  131. * 7127 Scroll of Escape to Hardin's Private Academy
  132. * 7128 Scroll of Escape to Heine
  133. * 7129 Scroll of Escape to the Town of Oren
  134. * 7130 Scroll of Escape to Ivory Tower
  135. * 7131 Scroll of Escape to Hunters Village
  136. * 7132 Scroll of Escape to Aden Castle Town
  137. * 7133 Scroll of Escape to the Town of Goddard
  138. * 7134 Scroll of Escape to the Rune Township
  139. * 7135 Scroll of Escape to the Town of Schuttgart.
  140. * 7554 Scroll of Escape to Talking Island
  141. * 7555 Scroll of Escape to Elven Village
  142. * 7556 Scroll of Escape to Dark Elf Village
  143. * 7557 Scroll of Escape to Orc Village
  144. * 7558 Scroll of Escape to Dwarven Village
  145. * 7559 Scroll of Escape to Giran Castle Town
  146. * 7618 Scroll of Escape - Ketra Orc Village
  147. * 7619 Scroll of Escape - Varka Silenos Village
  148. * 10129 Scroll of Escape : Fortress
  149. * 10130 Blessed Scroll of Escape : Fortress
  150. */
  151. if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT && activeChar.getKarma() > 0)
  152. {
  153. switch (_itemId)
  154. {
  155. case 736: case 1538: case 1829: case 1830: case 3958: case 5858:
  156. case 5859: case 6663: case 6664: case 7554: case 7555: case 7556:
  157. case 7557: case 7558: case 7559: case 7618: case 7619: case 10129:
  158. case 10130:
  159. return;
  160. }
  161. if (_itemId >= 7117 && _itemId <= 7135)
  162. return;
  163. }
  164. if (activeChar.isFishing() && (_itemId < 6535 || _itemId > 6540))
  165. {
  166. // You cannot do anything else while fishing
  167. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DO_WHILE_FISHING_3);
  168. getClient().getActiveChar().sendPacket(sm);
  169. sm = null;
  170. return;
  171. }
  172. // Char cannot use item when dead
  173. if (activeChar.isDead())
  174. {
  175. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
  176. sm.addItemName(item);
  177. getClient().getActiveChar().sendPacket(sm);
  178. sm = null;
  179. return;
  180. }
  181. // No UseItem is allowed while the player is in special conditions
  182. if (activeChar.isStunned()
  183. || activeChar.isSleeping()
  184. || activeChar.isParalyzed()
  185. || activeChar.isAlikeDead()
  186. || activeChar.isAfraid()
  187. || activeChar.isCastingNow())
  188. {
  189. return;
  190. }
  191. // Char cannot use pet items
  192. /*if ((item.getItem() instanceof L2Armor && item.getItem().getItemType() == L2ArmorType.PET)
  193. || (item.getItem() instanceof L2Weapon && item.getItem().getItemType() == L2WeaponType.PET) )
  194. {
  195. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_PET_ITEM); // You cannot equip a pet item.
  196. sm.addItemName(item);
  197. getClient().getActiveChar().sendPacket(sm);
  198. sm = null;
  199. return;
  200. }*/
  201. if (!activeChar.getInventory().canManipulateWithItemId(item.getItemId()))
  202. {
  203. activeChar.sendMessage("Cannot use this item.");
  204. return;
  205. }
  206. if (Config.DEBUG)
  207. _log.finest(activeChar.getObjectId() + ": use item " + _objectId);
  208. if (!item.isEquipped())
  209. {
  210. if (!item.getItem().checkCondition(activeChar, activeChar, true))
  211. {
  212. return;
  213. }
  214. }
  215. if (item.isEquipable())
  216. {
  217. // Don't allow hero equipment and restricted items during Olympiad
  218. if (activeChar.isInOlympiadMode() && (item.isHeroItem() || item.isOlyRestrictedItem()))
  219. {
  220. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.THIS_ITEM_CANT_BE_EQUIPPED_FOR_THE_OLYMPIAD_EVENT));
  221. return;
  222. }
  223. switch (item.getItem().getBodyPart())
  224. {
  225. case L2Item.SLOT_LR_HAND:
  226. case L2Item.SLOT_L_HAND:
  227. case L2Item.SLOT_R_HAND:
  228. {
  229. // prevent players to equip weapon while wearing combat flag
  230. if (activeChar.getActiveWeaponItem() != null && activeChar.getActiveWeaponItem().getItemId() == 9819)
  231. {
  232. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  233. return;
  234. }
  235. // Prevent player to remove the weapon on special conditions
  236. if (activeChar.isCastingNow() || activeChar.isCastingSimultaneouslyNow())
  237. {
  238. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_USE_ITEM_WHILE_USING_MAGIC));
  239. return;
  240. }
  241. if (activeChar.isMounted())
  242. {
  243. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  244. return;
  245. }
  246. if (activeChar.isDisarmed())
  247. {
  248. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  249. return;
  250. }
  251. // Don't allow weapon/shield equipment if a cursed weapon is equiped
  252. if (activeChar.isCursedWeaponEquipped())
  253. return;
  254. // Don't allow other Race to Wear Kamael exclusive Weapons.
  255. if (!item.isEquipped() && item.getItem() instanceof L2Weapon && !activeChar.isGM())
  256. {
  257. L2Weapon wpn = (L2Weapon)item.getItem();
  258. switch (activeChar.getRace())
  259. {
  260. case Kamael:
  261. {
  262. switch (wpn.getItemType())
  263. {
  264. case NONE:
  265. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  266. return;
  267. }
  268. break;
  269. }
  270. case Human:
  271. case Dwarf:
  272. case Elf:
  273. case DarkElf:
  274. case Orc:
  275. {
  276. switch (wpn.getItemType())
  277. {
  278. case RAPIER:
  279. case CROSSBOW:
  280. case ANCIENTSWORD:
  281. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  282. return;
  283. }
  284. break;
  285. }
  286. }
  287. }
  288. break;
  289. }
  290. case L2Item.SLOT_CHEST:
  291. case L2Item.SLOT_BACK:
  292. case L2Item.SLOT_GLOVES:
  293. case L2Item.SLOT_FEET:
  294. case L2Item.SLOT_HEAD:
  295. case L2Item.SLOT_FULL_ARMOR:
  296. case L2Item.SLOT_LEGS:
  297. {
  298. if (activeChar.getRace() == Race.Kamael &&
  299. (item.getItem().getItemType() == L2ArmorType.HEAVY
  300. ||item.getItem().getItemType() == L2ArmorType.MAGIC))
  301. {
  302. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  303. return;
  304. }
  305. break;
  306. }
  307. case L2Item.SLOT_DECO:
  308. {
  309. if (!item.isEquipped() && activeChar.getInventory().getMaxTalismanCount() == 0)
  310. {
  311. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
  312. return;
  313. }
  314. }
  315. }
  316. if (activeChar.isCursedWeaponEquipped() && _itemId == 6408) // Don't allow to put formal wear
  317. return;
  318. if (activeChar.isAttackingNow())
  319. {
  320. ThreadPoolManager.getInstance().scheduleGeneral( new WeaponEquipTask(item,activeChar), (activeChar.getAttackEndTime()-GameTimeController.getGameTicks())*GameTimeController.MILLIS_IN_TICK);
  321. return;
  322. }
  323. // Equip or unEquip
  324. if (FortSiegeManager.getInstance().isCombat(item.getItemId()))
  325. return; //no message
  326. else if (activeChar.isCombatFlagEquipped())
  327. return;
  328. activeChar.useEquippableItem(item, true);
  329. }
  330. else
  331. {
  332. L2Weapon weaponItem = activeChar.getActiveWeaponItem();
  333. int itemid = item.getItemId();
  334. if (itemid == 4393)
  335. {
  336. activeChar.sendPacket(new ShowCalculator(4393));
  337. }
  338. else if ((weaponItem != null && weaponItem.getItemType() == L2WeaponType.FISHINGROD)
  339. && ((itemid >= 6519 && itemid <= 6527) || (itemid >= 7610 && itemid <= 7613) || (itemid >= 7807 && itemid <= 7809) || (itemid >= 8484 && itemid <= 8486) || (itemid >= 8505 && itemid <= 8513)))
  340. {
  341. activeChar.getInventory().setPaperdollItem(Inventory.PAPERDOLL_LHAND, item);
  342. activeChar.broadcastUserInfo();
  343. // Send a Server->Client packet ItemList to this L2PcINstance to update left hand equipement
  344. ItemList il = new ItemList(activeChar, false);
  345. sendPacket(il);
  346. return;
  347. }
  348. else
  349. {
  350. IItemHandler handler = ItemHandler.getInstance().getItemHandler(item.getEtcItem());
  351. if (handler == null)
  352. {
  353. if (Config.DEBUG)
  354. _log.warning("No item handler registered for item ID " + item.getItemId() + ".");
  355. }
  356. else
  357. handler.useItem(activeChar, item, _ctrlPressed);
  358. }
  359. }
  360. // }
  361. }
  362. @Override
  363. public String getType()
  364. {
  365. return _C__14_USEITEM;
  366. }
  367. @Override
  368. protected boolean triggersOnActionRequest()
  369. {
  370. return !Config.SPAWN_PROTECTION_ALLOWED_ITEMS.contains(_itemId);
  371. }
  372. }