void CItemAddOption::SendItemUse(LPOBJ lpObj, int iItemNumber, int iOptionType, int iEffectType, int iEffectValue, int iValidTime)
{
	if ( lpObj == NULL ) 
		return;
	
	if ( iItemNumber== 0 || iEffectType == 0 ) 
		return;

	GCUseEffectItem(lpObj, 0, iOptionType, iEffectType, iValidTime);
}
//0055D060  /> \55            PUSH EBP
BYTE CItemAddOption::SetManualItemEffect(LPOBJ lpObj,int iEffectType,int iEffectValue,int iLeftTime)//calls 1x from GMMng.cpp
{
	if(iEffectType <= 0)
	{
		return FALSE;
	}

	if(iLeftTime <= 0)
	{
		iLeftTime = 60;
	}

	this->_SetItemEffect(lpObj,iEffectType,iEffectValue);

	GCUseEffectItem(lpObj,0,1,iEffectType,iLeftTime);
    this->SendItemUse(lpObj,iEffectType,1,iEffectType,iEffectValue,iLeftTime);

	return TRUE;

}
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue)
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife -= iEffectValue;

			if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life )
				lpObj->Life = lpObj->AddLife + lpObj->MaxLife;

			GCReFillSend(lpObj->m_Index, (WORD)lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCReFillSend(lpObj->m_Index, WORD(lpObj->MaxLife + lpObj->AddLife), 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana -= iEffectValue;

			if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana )
				lpObj->Mana = lpObj->AddMana + lpObj->MaxMana;


			GCManaSend(lpObj->m_Index, (short)lpObj->Mana, -1, 0, lpObj->BP);
			GCManaSend(lpObj->m_Index, short(lpObj->AddMana + lpObj->MaxMana), 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed -= iEffectValue;
			lpObj->m_MagicSpeed -= iEffectValue;
			break;

		case ADD_OPTION_EXPERIENCE:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DROP_RATE:
			lpObj->m_wItemDropRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case 8:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense -= iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->Strength -= iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->Dexterity -= iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->Vitality -= iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->Energy -= iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->Leadership -= iEffectValue;
			break;
			
        case ADD_OPTION_FORCE:
                lpObj->m_AttackDamageMaxLeft -= iEffectValue;
                lpObj->m_AttackDamageMinLeft -= iEffectValue;
                lpObj->m_AttackDamageMaxRight -= iEffectValue;
                lpObj->m_AttackDamageMinRight -= iEffectValue;
                break;
        case ADD_OPTION_MAGIC:
                lpObj->m_MagicDamageMin -= iEffectValue;
                lpObj->m_MagicDamageMax -= iEffectValue;
                break;
        case ADD_OPTION_MOVEABLE:
                lpObj->m_btMoveMapBound = 0;
                //Do nothing cuz mapmovebound is removed
                break;

		default:
			return false;
	}

	GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0);

	return true;
}
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue)
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife -= iEffectValue;

			if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life )
			{
				lpObj->Life = lpObj->AddLife + lpObj->MaxLife;
			}

			GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana -= iEffectValue;

			if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana )
			{
				lpObj->Mana = lpObj->AddMana + lpObj->MaxMana;
			}

			GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
			GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		/*case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed -= iEffectValue;
			lpObj->m_MagicSpeed -= iEffectValue;
			break;*/

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense -= iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->AddStrength -= iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->AddDexterity -= iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->AddVitality -= iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->AddEnergy -= iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->AddLeadership -= iEffectValue;
			break;

		case ADD_OPTION_WRATH:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			break;

		case ADD_OPTION_WIZARDRY:
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		case ADD_OPTION_MOBILITY:
			break;

		default:
			return false;
	}

	GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0);

	return true;
}