123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- /*
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.network.clientpackets;
- import java.util.logging.Logger;
- import com.l2jserver.Config;
- import com.l2jserver.gameserver.GameTimeController;
- import com.l2jserver.gameserver.ThreadPoolManager;
- import com.l2jserver.gameserver.handler.IItemHandler;
- import com.l2jserver.gameserver.handler.ItemHandler;
- import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
- import com.l2jserver.gameserver.model.L2ItemInstance;
- import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
- import com.l2jserver.gameserver.model.base.Race;
- import com.l2jserver.gameserver.model.itemcontainer.Inventory;
- import com.l2jserver.gameserver.network.SystemMessageId;
- import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
- import com.l2jserver.gameserver.network.serverpackets.ItemList;
- import com.l2jserver.gameserver.network.serverpackets.ShowCalculator;
- import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
- import com.l2jserver.gameserver.templates.item.L2Armor;
- import com.l2jserver.gameserver.templates.item.L2ArmorType;
- import com.l2jserver.gameserver.templates.item.L2Item;
- import com.l2jserver.gameserver.templates.item.L2Weapon;
- import com.l2jserver.gameserver.templates.item.L2WeaponType;
- /**
- * This class ...
- *
- * @version $Revision: 1.18.2.7.2.9 $ $Date: 2005/03/27 15:29:30 $
- */
- public final class UseItem extends L2GameClientPacket
- {
- private static Logger _log = Logger.getLogger(UseItem.class.getName());
- private static final String _C__14_USEITEM = "[C] 14 UseItem";
- private int _objectId;
- /** Weapon Equip Task */
- public class WeaponEquipTask implements Runnable
- {
- L2ItemInstance item;
- L2PcInstance activeChar;
- public WeaponEquipTask(L2ItemInstance it, L2PcInstance character){
- item = it;
- activeChar = character;
- }
- public void run()
- {
- //If character is still engaged in strike we should not change weapon
- if (activeChar.isAttackingNow())
- return;
- // Equip or unEquip
- activeChar.useEquippableItem(item, false);
- }
- }
-
- @Override
- protected void readImpl()
- {
- _objectId = readD();
- // TODO:
- //readD();
- }
- @Override
- protected void runImpl()
- {
- L2PcInstance activeChar = getClient().getActiveChar();
- if (activeChar == null)
- return;
-
- // Flood protect UseItem
- if (!activeChar.getFloodProtectors().getUseItem().tryPerformAction("use item"))
- return;
- if (activeChar.getPrivateStoreType() != 0)
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE));
- activeChar.sendPacket(ActionFailed.STATIC_PACKET);
- return;
- }
- if (activeChar.getActiveTradeList() != null)
- activeChar.cancelActiveTrade();
- // NOTE: disabled due to deadlocks
- // synchronized (activeChar.getInventory())
- // {
- L2ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
- if (item == null)
- return;
-
- if (item.isWear())
- {
- // No unequipping wear-items
- return;
- }
- if (item.getItem().getType2() == L2Item.TYPE2_QUEST)
- {
- SystemMessage sm = new SystemMessage(SystemMessageId.CANNOT_USE_QUEST_ITEMS);
- activeChar.sendPacket(sm);
- sm = null;
- return;
- }
- int itemId = item.getItemId();
- /*
- * Alt game - Karma punishment // SOE
- * 736 Scroll of Escape
- * 1538 Blessed Scroll of Escape
- * 1829 Scroll of Escape: Clan Hall
- * 1830 Scroll of Escape: Castle
- * 3958 L2Day - Blessed Scroll of Escape
- * 5858 Blessed Scroll of Escape: Clan Hall
- * 5859 Blessed Scroll of Escape: Castle
- * 6663 Scroll of Escape: Orc Village
- * 6664 Scroll of Escape: Silenos Village
- * 7117 Scroll of Escape to Talking Island
- * 7118 Scroll of Escape to Elven Village
- * 7119 Scroll of Escape to Dark Elf Village
- * 7120 Scroll of Escape to Orc Village
- * 7121 Scroll of Escape to Dwarven Village
- * 7122 Scroll of Escape to Gludin Village
- * 7123 Scroll of Escape to the Town of Gludio
- * 7124 Scroll of Escape to the Town of Dion
- * 7125 Scroll of Escape to Floran
- * 7126 Scroll of Escape to Giran Castle Town
- * 7127 Scroll of Escape to Hardin's Private Academy
- * 7128 Scroll of Escape to Heine
- * 7129 Scroll of Escape to the Town of Oren
- * 7130 Scroll of Escape to Ivory Tower
- * 7131 Scroll of Escape to Hunters Village
- * 7132 Scroll of Escape to Aden Castle Town
- * 7133 Scroll of Escape to the Town of Goddard
- * 7134 Scroll of Escape to the Rune Township
- * 7135 Scroll of Escape to the Town of Schuttgart.
- * 7554 Scroll of Escape to Talking Island
- * 7555 Scroll of Escape to Elven Village
- * 7556 Scroll of Escape to Dark Elf Village
- * 7557 Scroll of Escape to Orc Village
- * 7558 Scroll of Escape to Dwarven Village
- * 7559 Scroll of Escape to Giran Castle Town
- * 7618 Scroll of Escape - Ketra Orc Village
- * 7619 Scroll of Escape - Varka Silenos Village
- * 10129 Scroll of Escape : Fortress
- * 10130 Blessed Scroll of Escape : Fortress
- */
- if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT && activeChar.getKarma() > 0)
- {
- switch (itemId)
- {
- case 736: case 1538: case 1829: case 1830: case 3958: case 5858:
- case 5859: case 6663: case 6664: case 7554: case 7555: case 7556:
- case 7557: case 7558: case 7559: case 7618: case 7619: case 10129:
- case 10130:
- return;
- }
-
- if (itemId >= 7117 && itemId <= 7135)
- return;
- }
- // Items that cannot be used
- if (itemId == 57)
- return;
-
- if (activeChar.isFishing() && (itemId < 6535 || itemId > 6540))
- {
- // You cannot do anything else while fishing
- SystemMessage sm = new SystemMessage(SystemMessageId.CANNOT_DO_WHILE_FISHING_3);
- getClient().getActiveChar().sendPacket(sm);
- sm = null;
- return;
- }
- // Char cannot use item when dead
- if (activeChar.isDead())
- {
- SystemMessage sm = new SystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
- sm.addItemName(item);
- getClient().getActiveChar().sendPacket(sm);
- sm = null;
- return;
- }
- // Char cannot use pet items
- if ((item.getItem() instanceof L2Armor && item.getItem().getItemType() == L2ArmorType.PET)
- || (item.getItem() instanceof L2Weapon && item.getItem().getItemType() == L2WeaponType.PET) )
- {
- SystemMessage sm = new SystemMessage(SystemMessageId.CANNOT_EQUIP_PET_ITEM); // You cannot equip a pet item.
- sm.addItemName(item);
- getClient().getActiveChar().sendPacket(sm);
- sm = null;
- return;
- }
- if (Config.DEBUG)
- _log.finest(activeChar.getObjectId() + ": use item " + _objectId);
-
- if (!item.isEquipped())
- {
- if (!item.getItem().checkCondition(activeChar, activeChar, true))
- return;
- }
-
- if (item.isEquipable())
- {
- // No unequipping/equipping while the player is in special conditions
- if (activeChar.isStunned()
- || activeChar.isSleeping()
- || activeChar.isParalyzed()
- || activeChar.isAlikeDead()
- || activeChar.isCastingNow())
- {
- return;
- }
- // Don't allow hero equipment and restricted items during Olympiad
- if (activeChar.isInOlympiadMode() && (item.isHeroItem() || item.isOlyRestrictedItem()))
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.THIS_ITEM_CANT_BE_EQUIPPED_FOR_THE_OLYMPIAD_EVENT));
- return;
- }
-
- switch (item.getItem().getBodyPart())
- {
- case L2Item.SLOT_LR_HAND:
- case L2Item.SLOT_L_HAND:
- case L2Item.SLOT_R_HAND:
- {
- // prevent players to equip weapon while wearing combat flag
- if (activeChar.getActiveWeaponItem() != null && activeChar.getActiveWeaponItem().getItemId() == 9819)
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- // Prevent player to remove the weapon on special conditions
- if (activeChar.isCastingNow() || activeChar.isCastingSimultaneouslyNow())
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_USE_ITEM_WHILE_USING_MAGIC));
- return;
- }
- if (activeChar.isMounted())
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- if (activeChar.isDisarmed())
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
-
- // Don't allow weapon/shield equipment if a cursed weapon is equiped
- if (activeChar.isCursedWeaponEquipped())
- return;
-
- // Don't allow other Race to Wear Kamael exclusive Weapons.
- if (!item.isEquipped() && item.getItem() instanceof L2Weapon && !activeChar.isGM())
- {
- L2Weapon wpn = (L2Weapon)item.getItem();
-
- switch (activeChar.getRace())
- {
- case Kamael:
- {
- switch (wpn.getItemType())
- {
- case NONE:
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- break;
- }
- case Human:
- case Dwarf:
- case Elf:
- case DarkElf:
- case Orc:
- {
- switch (wpn.getItemType())
- {
- case RAPIER:
- case CROSSBOW:
- case ANCIENT_SWORD:
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- break;
- }
- }
- }
- break;
- }
- case L2Item.SLOT_CHEST:
- case L2Item.SLOT_BACK:
- case L2Item.SLOT_GLOVES:
- case L2Item.SLOT_FEET:
- case L2Item.SLOT_HEAD:
- case L2Item.SLOT_FULL_ARMOR:
- case L2Item.SLOT_LEGS:
- {
- if (activeChar.getRace() == Race.Kamael &&
- (item.getItem().getItemType() == L2ArmorType.HEAVY
- ||item.getItem().getItemType() == L2ArmorType.MAGIC))
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- break;
- }
- case L2Item.SLOT_DECO:
- {
- if (!item.isEquipped() && activeChar.getInventory().getMaxTalismanCount() == 0)
- {
- activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_EQUIP_ITEM_DUE_TO_BAD_CONDITION));
- return;
- }
- }
- }
-
- if (activeChar.isCursedWeaponEquipped() && itemId == 6408) // Don't allow to put formal wear
- return;
- if (activeChar.isAttackingNow())
- {
- ThreadPoolManager.getInstance().scheduleGeneral( new WeaponEquipTask(item,activeChar), (activeChar.getAttackEndTime()-GameTimeController.getGameTicks())*GameTimeController.MILLIS_IN_TICK);
- return;
- }
- // Equip or unEquip
- if (FortSiegeManager.getInstance().isCombat(item.getItemId()))
- return; //no message
- else if (activeChar.isCombatFlagEquipped())
- return;
- activeChar.useEquippableItem(item, true);
- }
- else
- {
- L2Weapon weaponItem = activeChar.getActiveWeaponItem();
- int itemid = item.getItemId();
- if (itemid == 4393)
- {
- activeChar.sendPacket(new ShowCalculator(4393));
- }
- else if ((weaponItem != null && weaponItem.getItemType() == L2WeaponType.ROD)
- && ((itemid >= 6519 && itemid <= 6527) || (itemid >= 7610 && itemid <= 7613) || (itemid >= 7807 && itemid <= 7809) || (itemid >= 8484 && itemid <= 8486) || (itemid >= 8505 && itemid <= 8513)))
- {
- activeChar.getInventory().setPaperdollItem(Inventory.PAPERDOLL_LHAND, item);
- activeChar.broadcastUserInfo();
- // Send a Server->Client packet ItemList to this L2PcINstance to update left hand equipement
- ItemList il = new ItemList(activeChar, false);
- sendPacket(il);
- return;
- }
- else
- {
- IItemHandler handler = ItemHandler.getInstance().getItemHandler(item.getEtcItem());
- if (handler == null)
- {
- if (Config.DEBUG)
- _log.warning("No item handler registered for item ID " + item.getItemId() + ".");
- }
- else
- handler.useItem(activeChar, item);
- }
- }
- // }
- }
- @Override
- public String getType()
- {
- return _C__14_USEITEM;
- }
- }
|