All pastes #839145 Raw Edit

Jemand

public text v1 · immutable
#839145 ·published 2007-12-30 21:31 UTC
rendered paste body
/*
 * 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 2, 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, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307, USA.
 * 
 * http://www.gnu.org/copyleft/gpl.html
 */
package net.sf.l2j.gameserver.network.clientpackets;

import java.util.Arrays;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.handler.ItemHandler;
import net.sf.l2j.gameserver.model.Inventory;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate;
import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.network.serverpackets.ItemList;
import net.sf.l2j.gameserver.network.serverpackets.ShowCalculator;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.network.serverpackets.UserInfo;
import net.sf.l2j.gameserver.templates.L2Item;
import net.sf.l2j.gameserver.templates.L2Weapon;
import net.sf.l2j.gameserver.templates.L2WeaponType;
import net.sf.l2j.gameserver.templates.L2ArmorType;
import net.sf.l2j.gameserver.util.FloodProtector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This class ...
 * 
 * @version $Revision: 1.18.2.7.2.9 $ $Date: 2005/03/27 15:29:30 $
 */
public class UseItem extends L2GameClientPacket
{
	private final static Log	_log			= LogFactory.getLog(UseItem.class.getName());
	private static final String	_C__14_USEITEM	= "[C] 14 UseItem";
	
	private int					_objectId;
	private int					_unknown;
	
	/**
	 * packet type id 0x14 format: cd
	 * 
	 * @param decrypt
	 */
	@Override
	protected void readImpl()
	{
		_objectId = readD();
		_unknown = readD();
	}
	
	@Override
	protected void runImpl()
	{
		
		L2PcInstance activeChar = getClient().getActiveChar();
		
		if (activeChar == null)
			return;
		
		// Flood protect UseItem
		if (!FloodProtector.getInstance().tryPerformAction(activeChar.getObjectId(), FloodProtector.PROTECTED_USEITEM))
			return;
		
		if (activeChar.getPrivateStoreType() != 0)
		{
			activeChar.sendPacket(new SystemMessage(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE));
			activeChar.sendPacket(new ActionFailed());
			return;
		}
		
		L2ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
		
		if (item == null)
			return;
		
		if (item.isWear())
		{
			// No unequipping wear-items
			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
		 */
		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT
				&& activeChar.getKarma() > 0
				&& (itemId == 736 || itemId == 1538 || itemId == 1829 || itemId == 1830 || itemId == 3958 || itemId == 5858 || itemId == 5859 || itemId == 6663
						|| itemId == 6664 || (itemId >= 7117 && itemId <= 7135) || (itemId >= 7554 && itemId <= 7559) || itemId == 7618 || itemId == 7619))
			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().isForWolf() || item.getItem().isForHatchling() || item.getItem().isForStrider() || item.getItem().isForBabyPet())
		{
			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 (_log.isDebugEnabled())
			_log.debug(activeChar.getObjectId() + ": use item " + _objectId);
		
		if (item.isEquipable())
		{
			if (activeChar.isDisarmed())
				return;
			
			if (activeChar.isKamaelic())
			{
				if (item.getItemType() == L2ArmorType.HEAVY && !Config.KAMAEL_CAN_USE_HEAVY)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
				if (item.getItemType() == L2ArmorType.MAGIC && !Config.KAMAEL_CAN_USE_MAGIC)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
				if (item.getItemType() == L2WeaponType.NONE && !Config.KAMAEL_CAN_USE_SHIELD)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
			}
			else
			{
				if (item.getItemType() == L2WeaponType.CROSSBOW && !Config.HUMAN_CAN_USE_CROSSBOW)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
				if (item.getItemType() == L2WeaponType.RAPIER && !Config.HUMAN_CAN_USE_RAPIER)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
				if (item.getItemType() == L2WeaponType.ANCIENT_SWORD && !Config.HUMAN_CAN_USE_ANCIENT)
				{
					activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CONDITION_TO_EQUIP));
					return;
				}
			}
			
			// No unequipping/equipping while the player is in special conditions
			if (activeChar.isStunned() || activeChar.isSleeping() || activeChar.isParalyzed() || activeChar.isAlikeDead())
			{
				activeChar.sendMessage("Your status does not allow you to do that.");
				return;
			}
			
			int bodyPart = item.getItem().getBodyPart();
			
			// Prevent player to remove the weapon on special conditions
			if ((activeChar.isAttackingNow() || activeChar.isCastingNow() || activeChar.isMounted() || (activeChar._inEventCTF && activeChar._haveFlagCTF))
					&& (bodyPart == L2Item.SLOT_LR_HAND || bodyPart == L2Item.SLOT_L_HAND || bodyPart == L2Item.SLOT_R_HAND))
			{
				if (activeChar._inEventCTF && activeChar._haveFlagCTF)
					activeChar.sendMessage("This item can not be equipped when you have the flag.");
				return;
			}
			
			// Don't allow weapon/shield equipment if a cursed weapon is equiped
			if (activeChar.isCursedWeaponEquiped()
					&& ((bodyPart == L2Item.SLOT_LR_HAND || bodyPart == L2Item.SLOT_L_HAND || bodyPart == L2Item.SLOT_R_HAND) || itemId == 6408)) // Don't allow to put formal wear
				return;
			
			activeChar.abortCast();
			if (activeChar.getAI().getIntention() == CtrlIntention.AI_INTENTION_CAST)
				activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
			
			// Don't allow weapon/shield hero equipment during Olympiads
			if (activeChar.isInOlympiadMode() && (bodyPart == L2Item.SLOT_LR_HAND || bodyPart == L2Item.SLOT_L_HAND || bodyPart == L2Item.SLOT_R_HAND)
					&& ((item.getItemId() >= 6611 && item.getItemId() <= 6621) || item.getItemId() == 6842))
				return;
			
			// Equip or unEquip
			boolean isEquiped = item.isEquipped();
			SystemMessage sm = null;
            if(!isEquiped)
            {
                L2ItemInstance ae = activeChar.getInventory().getPaperdollItemByL2ItemId(bodyPart);
                if(ae != null)
                {
            		//Find Arrows if arrows are equipped in LHand:
            		if (activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND) == 
            			activeChar.getInventory().findArrowForBow(ae.getItem()))
            		{
            			//Remove arrows if they're equipped:
            			activeChar.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_LHAND);
            			activeChar.getInventory().setPaperdollItem(Inventory.PAPERDOLL_LHAND, null);
            		}                	
                    activeChar.getInventory().unEquipItemInBodySlotAndRecord(bodyPart);
                    activeChar.checkSSMatch(item, ae);
    				if (ae.getEnchantLevel() > 0)
    				{
    					sm = new SystemMessage(SystemMessageId.S1_S2_EQUIPPED);
    					sm.addNumber(ae.getEnchantLevel());
    					sm.addItemName(ae);
    				}
    				else
    				{
    					sm = new SystemMessage(SystemMessageId.S1_EQUIPPED);
    					sm.addItemName(ae);
    				}
                    if(ae.isAugmented())
                        ae.getAugmentation().removeBoni(activeChar);
                    activeChar.getInventory().equipItemAndRecord(item);
                    if(item.isAugmented())
                        item.getAugmentation().applyBoni(activeChar);
                }
                else
                {
                    activeChar.getInventory().equipItemAndRecord(item);
                    if(item.isAugmented())
                        item.getAugmentation().applyBoni(activeChar);
                }
            }
            else
            {
                if(item.isWear())
                    return;

            	if (bodyPart == L2Item.SLOT_L_EAR || bodyPart == L2Item.SLOT_LR_EAR ||
                	bodyPart == L2Item.SLOT_L_FINGER || bodyPart == L2Item.SLOT_LR_FINGER)
                		activeChar.getInventory().setPaperdollItem(item.getEquipSlot(), null);
                
                activeChar.getInventory().unEquipItemInBodySlotAndRecord(bodyPart);
				if (item.getEnchantLevel() > 0)
				{
					sm = new SystemMessage(SystemMessageId.EQUIPMENT_S1_S2_REMOVED);
					sm.addNumber(item.getEnchantLevel());
					sm.addItemName(item);
				}
				else
				{
					sm = new SystemMessage(SystemMessageId.S1_DISARMED);
					sm.addItemName(item);
				}

                if(item.isAugmented())
                    item.getAugmentation().removeBoni(activeChar);
                
                activeChar.sendPacket(sm);
            }
            item.decreaseMana(false);
            
            activeChar.refreshExpertisePenalty();
            
            if(item.getItem().getType2() == 0)
                activeChar.checkIfWeaponIsAllowed();

            activeChar.abortAttack();
            
			activeChar.sendPacket(new EtcStatusUpdate(activeChar));
			// if an "invisible" item has changed (Jewels, helmet),
			// we dont need to send broadcast packet to all other users
			if (!((item.getItem().getBodyPart() & L2Item.SLOT_HEAD) > 0 || (item.getItem().getBodyPart() & L2Item.SLOT_NECK) > 0
					|| (item.getItem().getBodyPart() & L2Item.SLOT_L_EAR) > 0 || (item.getItem().getBodyPart() & L2Item.SLOT_R_EAR) > 0
					|| (item.getItem().getBodyPart() & L2Item.SLOT_L_FINGER) > 0 || (item.getItem().getBodyPart() & L2Item.SLOT_R_FINGER) > 0))
			{
				activeChar.broadcastUserInfo();
				InventoryUpdate iu = new InventoryUpdate();
	            iu.addItem(item);
				activeChar.sendPacket(iu);
			}
			else if ((item.getItem().getBodyPart() & L2Item.SLOT_HEAD) > 0)
			{
				InventoryUpdate iu = new InventoryUpdate();
	            iu.addItem(item);
				activeChar.sendPacket(iu);
				activeChar.sendPacket(new UserInfo(activeChar));
			}
			else
			{
				// because of complicated jewels problem i'm forced to resend the item list :(
				activeChar.sendPacket(new ItemList(activeChar, true));
				activeChar.sendPacket(new UserInfo(activeChar));
			}            
            activeChar.sendPacket(new ItemList(activeChar, false));
        } 
		else
        {
            L2Weapon weaponItem = activeChar.getActiveWeaponItem();
            int itemid = item.getItemId();
            // _log.debug("item not equipable id:"+ 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(itemId);
				
				if (handler == null)
					_log.debug("No item handler registered for item ID " + itemId + ".");
				else
					handler.useItem(activeChar, item);
			}
        }
	}
	
	@Override
	public String getType()
	{
		return _C__14_USEITEM;
	}
}