void UGAAbilityBase::StartActivation(bool bApplyActivationEffect)
{
	if (!CanUseAbility())
	{
		UE_LOG(AbilityFramework, Log, TEXT("Cannot use Ability: %s"), *GetName());
		return;
	}
	//AbilityComponent->ExecutingAbility = this;
	AbilityState = EAFAbilityState::Activating;
	NativeOnBeginAbilityActivation(bApplyActivationEffect);
}
bool CAbilityState::Update(time_point tick)
{
    if (!IsCompleted() && tick > GetEntryTime() + m_castTime)
    {
        if (CanUseAbility())
        {
            action_t action;
            m_PEntity->OnAbility(*this, action);
            m_PEntity->PAI->EventHandler.triggerListener("ABILITY_USE", m_PEntity, GetTarget(), m_PAbility.get(), &action);
            m_PEntity->loc.zone->PushPacket(m_PEntity, CHAR_INRANGE_SELF, new CActionPacket(action));
        }
        Complete();
    }

    if (IsCompleted() && tick > GetEntryTime() + m_castTime + m_PAbility->getAnimationTime())
    {
        m_PEntity->PAI->EventHandler.triggerListener("ABILITY_STATE_EXIT", m_PEntity, m_PAbility.get());
        return true;
    }

    return false;
}
Exemple #3
0
ORESULT AbilityMachining::OnProcOver(Obj_Human* pHuman)
{
__ENTER_FUNCTION

	Assert( pHuman );

	AbilityOpera* pAbilityOpera;

	pAbilityOpera = pHuman->GetAbilityOpera();
	Assert( pAbilityOpera );

	switch( pAbilityOpera->m_SubType )
	{
	case NORMAL_TYPE:
		return AbilityCompound::OnProcOver(pHuman);
	case GEM_COMPOUND:
		{
			ORESULT res;
			BOOL flag = FALSE;
			LuaInterface* pLuaInterface;
			UINT itemIndex;

			res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化
			if( res != OR_OK )
			{
				return res;
			}

			pLuaInterface = pHuman->getScene()->GetLuaInterface();
			
			

			itemIndex = HumanItemLogic::GetBagItem(pHuman,
												pAbilityOpera->m_BagPos[0])->GetItemTableIndex();

			// 不管成功失败,宝石是没有了
			GCDiscardItemResult Msg;
			GamePlayer* pGamePlayer;
			pGamePlayer = (GamePlayer*)pHuman->GetPlayer();
			Assert( pGamePlayer != NULL );
			ITEM_LOG_PARAM	ItemLogParam;
			ItemLogParam.OpType	= ITEM_GEM_COMPOUND_LOST;
			BOOL bRet	=	HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,pAbilityOpera->m_BagPos[0]);
			if(bRet)
			{
				SaveItemLog(&ItemLogParam);
			}
			Msg.setItemTableIndex( itemIndex );
			Msg.setResult( DISCARDITEM_SUCCESS );
			Msg.setBagIndex( pAbilityOpera->m_BagPos[0] );
			pGamePlayer->SendPacket( &Msg );
			

			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,pAbilityOpera->m_BagPos[1]);
			if(bRet)
			{
				SaveItemLog(&ItemLogParam);
			}
			Msg.setBagIndex( pAbilityOpera->m_BagPos[1] );
			pGamePlayer->SendPacket( &Msg );

			if( pLuaInterface->ExeScript_DDD(	ABILITY_LOGIC_SCRIPT, 
												"CompoundProc", 
												(INT)pHuman->getScene()->SceneID(),
												(INT)pHuman->GetID(), 
												(INT)itemIndex ) != FALSE ) // 这里显然需要调用 lua script
			{ // 脚本判断是否合成成功,成功了自动增加熟练度
				flag = TRUE;
				pAbilityOpera->m_uItemIndex = itemIndex;
				res = OnProcSuccess( pHuman );
			}

			if( flag == TRUE )
			{
				return res;
			}
			else
			{
				return OR_FAILURE;
			}
		}
		break;
	case GEM_EMBED:
		{
			ORESULT res;

			enum EmbedResult
			{
				EMBED_SUCCESS = 0,
				GEM_GONE,
				EQUIP_GONE,
				BOTH_GONE,
			};
			
			EmbedResult flag;
			LuaInterface* pLuaInterface;

			BYTE GemBagIndex = pAbilityOpera->m_BagPos[0];
			BYTE EquipBagIndex = pAbilityOpera->m_BagPos[1];

			UINT GemIndex = 
			HumanItemLogic::GetBagItem(pHuman,GemBagIndex)->GetItemTableIndex();

			UINT EquipIndex = 
			HumanItemLogic::GetBagItem(pHuman,EquipBagIndex)->GetItemTableIndex();
			res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化
			if( res != OR_OK )
			{
				return res;
			}

			pLuaInterface = pHuman->getScene()->GetLuaInterface();
			// 脚本判断是否镶嵌成功,如果成功则主动加上熟练度
			// 否则返回失败情况
			flag = (EmbedResult)pLuaInterface->ExeScript_DDD(	ABILITY_LOGIC_SCRIPT, 
																"EmbedProc", 
																(INT)pHuman->getScene()->SceneID(),
																(INT)pHuman->GetID(), 
																(INT)GemIndex ) ;

			GCDiscardItemResult Msg;
			Msg.setResult( DISCARDITEM_SUCCESS );
			GamePlayer* pGamePlayer = (GamePlayer*)(pHuman->GetPlayer());
			ITEM_LOG_PARAM	ItemLogParam;
			ItemLogParam.OpType	=	ITEM_MACHINE_LOST;
			BOOL bRet	= FALSE;
			switch(flag)
			{
			case EMBED_SUCCESS:
				{
					INT nRet;// = pHuman->UseGem(GemBagIndex, EquipBagIndex);
					if(USEGEM_SUCCESS == nRet)
					{
						g_ImpactCore.SendImpactToUnit(*pHuman, 49, pHuman->GetID());
					}
				}
				return OnProcSuccess(pHuman);
			case GEM_GONE:
				bRet =	HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
				if(bRet) SaveItemLog(&ItemLogParam);
				//pHuman->EraseItem(GemBagIndex);
				Msg.setItemTableIndex( GemIndex );
				Msg.setBagIndex( GemBagIndex );
				pGamePlayer->SendPacket( &Msg );
				return OR_FAILURE;
			case EQUIP_GONE:
				bRet	=	HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
				if(bRet)	SaveItemLog(&ItemLogParam);
				//pHuman->EraseItem(EquipBagIndex);
				Msg.setItemTableIndex( EquipIndex );
				Msg.setBagIndex( EquipBagIndex );
				pGamePlayer->SendPacket( &Msg );
				return OR_FAILURE;
			case BOTH_GONE:

				bRet	=	HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
				if(bRet)	SaveItemLog(&ItemLogParam);
				bRet	=	HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
				if(bRet)	SaveItemLog(&ItemLogParam);
				Msg.setItemTableIndex( GemIndex );
				Msg.setBagIndex( GemBagIndex );
				pGamePlayer->SendPacket( &Msg );

				Msg.setItemTableIndex( EquipIndex );
				Msg.setBagIndex( EquipBagIndex );
				pGamePlayer->SendPacket( &Msg );
				return OR_FAILURE;
			default:
				Assert(FALSE);
				return OR_ERROR;
			}
		}
		break;
	default:
		Assert(FALSE);
		return OR_ERROR;
	}

	return OR_WARNING;

__LEAVE_FUNCTION

	return OR_ERROR;
}
bool UGAAbilityBase::BP_CanUseAbility()
{
	return CanUseAbility();
}
Exemple #5
0
ORESULT AbilityInlay::OnProcOver(Obj_Human* pHuman)
{
__ENTER_FUNCTION

	Assert( pHuman );

	ORESULT res;

	res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化
	if( res != OR_OK )
	{
		return res;
	}

	AbilityOpera* pAbilityOpera;

	pAbilityOpera = pHuman->GetAbilityOpera();
	Assert( pAbilityOpera );

	BYTE GemBagIndex = pAbilityOpera->m_BagPos[0];
	BYTE EquipBagIndex = pAbilityOpera->m_BagPos[1];
	CHAR MaterialBagIndex1 = (CHAR)pAbilityOpera->m_BagPos[2];
	CHAR MaterialBagIndex2 = (CHAR)pAbilityOpera->m_BagPos[3];

	Item* pGemItem = HumanItemLogic::GetBagItem( pHuman, GemBagIndex );
	Item* pEquipItem = HumanItemLogic::GetBagItem( pHuman, EquipBagIndex );
	Item* pMaterialItem1 = NULL;
	Item* pMaterialItem2 = NULL;
	if( MaterialBagIndex1 != -1 )
	{
		pMaterialItem1 = HumanItemLogic::GetBagItem( pHuman, MaterialBagIndex1 );
		Assert(pMaterialItem1 != NULL);
		
		
	}
	if( MaterialBagIndex2 != -1 )
	{
		pMaterialItem2 = HumanItemLogic::GetBagItem( pHuman, MaterialBagIndex2 );
		Assert(pMaterialItem1 != NULL);

		
	}
	Assert( (pGemItem != NULL) && (pEquipItem != NULL) );

	UINT GemIndex = pGemItem->GetItemTableIndex();
	UINT EquipIndex = pEquipItem->GetItemTableIndex();
	INT MaterialIndex1 = -1;
	INT MaterialIndex2 = -1;
	if( pMaterialItem1 )
	{
		MaterialIndex1 = pMaterialItem1->GetItemTableIndex();
		//if(pMaterialItem1)
		//	pMaterialItem1->SetItemParam( 0, IPV_INT, INT( EquipBagIndex ) );//modi:lby20071114记录当前装备的id
	}
	if( pMaterialItem2 )
	{
		MaterialIndex2 = pMaterialItem2->GetItemTableIndex();

		//if(pMaterialItem2)
			//pMaterialItem2->SetItemParam( 0, IPV_INT, INT( EquipBagIndex ) );//modi:lby20071114记录当前装备的id
	}

	if( (pGemItem->IsLock())
	 || (pEquipItem->IsLock())
	 || (pGemItem->IsPWLock())
	 || (pEquipItem->IsPWLock())
	 )
	{ // 这里判断是否锁定,下面消耗时就不再判断了
		return OR_STUFF_LACK;
	}
	if( pMaterialItem1 )
	{
		if( pMaterialItem1->IsLock()
			|| pMaterialItem1->IsPWLock()
			)
			return OR_STUFF_LACK;
	}
	if( pMaterialItem2 )
	{
		if( pMaterialItem2->IsLock()
			|| pMaterialItem2->IsPWLock()
			)
			return OR_STUFF_LACK;
	}

	EmbedResult flag;
	LuaInterface* pLuaInterface;

	pLuaInterface = pHuman->getScene()->GetLuaInterface();
	// 脚本判断是否镶嵌成功,如果成功则主动加上熟练度
	// 否则返回失败情况
	flag = (EmbedResult)pLuaInterface->ExeScript_DDDDDD(ABILITY_LOGIC_SCRIPT, DEF_GEM_EMBED_PROCESS, 
														(INT)pHuman->getScene()->SceneID(),
														(INT)pHuman->GetID(), 
														(INT)EquipBagIndex,
														(INT)GemIndex,
														(INT)MaterialIndex1,
														(INT)MaterialIndex2 ) ;

	GCDiscardItemResult Msg;
	Msg.setResult( DISCARDITEM_SUCCESS );
	GamePlayer* pGamePlayer = (GamePlayer*)(pHuman->GetPlayer());
	ITEM_LOG_PARAM	ItemLogParam;
	ItemLogParam.OpType	= ITEM_INLAY_LOST;
	
	BOOL bRet = FALSE;
	switch(flag)
	{
	case EMBED_SUCCESS:
		{
			if( MaterialIndex1 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}
			if( MaterialIndex2 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}

			INT nRet ;//= pHuman->UseGem(GemBagIndex, EquipBagIndex);
			if(USEGEM_SUCCESS == nRet)
			{
				g_ImpactCore.SendImpactToUnit(*pHuman, 49, pHuman->GetID());
			}
			return OnProcSuccess(pHuman);
		}
	case GEM_GONE:
		
		if( MaterialIndex1 != -1 )
		{
		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}
		if( MaterialIndex2 != -1 )
		{
			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}

		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
		if(bRet)	SaveItemLog(&ItemLogParam);

		Msg.setItemTableIndex( GemIndex );
		Msg.setBagIndex( GemBagIndex );
		pGamePlayer->SendPacket( &Msg );
		return OR_FAILURE;
	case EQUIP_GONE:
		if( MaterialIndex1 != -1 )
		{
		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}
		if( MaterialIndex2 != -1 )
		{
			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}

		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
		if(bRet)	SaveItemLog(&ItemLogParam);

		Msg.setItemTableIndex( EquipIndex );
		Msg.setBagIndex( EquipBagIndex );
		pGamePlayer->SendPacket( &Msg );
		return OR_FAILURE;
	case BOTH_GONE:

		if( MaterialIndex1 != -1 )
		{
		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}
		if( MaterialIndex2 != -1 )
		{
		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);
		}

		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex);
		if(bRet)	SaveItemLog(&ItemLogParam);
		bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
		if(bRet)	SaveItemLog(&ItemLogParam);

		Msg.setItemTableIndex( GemIndex );
		Msg.setBagIndex( GemBagIndex );
		pGamePlayer->SendPacket( &Msg );

		Msg.setItemTableIndex( EquipIndex );
		Msg.setBagIndex( EquipBagIndex );
		pGamePlayer->SendPacket( &Msg );
		return OR_FAILURE;
	case ENERGY_NOT_ENOUGH:
		return OR_NOT_ENOUGH_ENERGY;
	case GEM_DEGRADE_1:
		{
			if( MaterialIndex1 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}
			if( MaterialIndex2 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}

			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);

			_ITEM_TYPE	 type = ConvertSerial2ItemType(GemIndex);
		/*	if(type.m_Quality>1)
			{
				type.m_Quality--;
				ITEM_LOG_PARAM	ItemLogParam;
				ItemLogParam.OpType		= ITEM_CREATE_REMOVE_GEM;
				ItemLogParam.CharGUID	= pHuman->GetGUID();
				ItemLogParam.SceneID	= pHuman->getScene()->SceneID();
				ItemLogParam.XPos		= pHuman->getWorldPos()->m_fX;
				ItemLogParam.ZPos		= pHuman->getWorldPos()->m_fZ;
				UINT GemBagIndex_Temp = GemBagIndex;
				HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER);
			}*/

			Msg.setItemTableIndex( GemIndex );
			Msg.setBagIndex( GemBagIndex );
			pGamePlayer->SendPacket( &Msg );
		}
		return OR_FAILURE;
	case GEM_DEGRADE_2:
		{
			if( MaterialIndex1 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}
			if( MaterialIndex2 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}

			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);

			_ITEM_TYPE	 type = ConvertSerial2ItemType(GemIndex);
			/*if(type.m_Quality>2)
			{
				type.m_Quality -= 2;
				ITEM_LOG_PARAM	ItemLogParam;
				ItemLogParam.OpType		= ITEM_CREATE_REMOVE_GEM;
				ItemLogParam.CharGUID	= pHuman->GetGUID();
				ItemLogParam.SceneID	= pHuman->getScene()->SceneID();
				ItemLogParam.XPos		= pHuman->getWorldPos()->m_fX;
				ItemLogParam.ZPos		= pHuman->getWorldPos()->m_fZ;
				UINT GemBagIndex_Temp = GemBagIndex;
				HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER);
			}*/

			Msg.setItemTableIndex( GemIndex );
			Msg.setBagIndex( GemBagIndex );
			pGamePlayer->SendPacket( &Msg );
		}
		return OR_FAILURE;
	case GEM_DEGRADE_3:
		{
			if( MaterialIndex1 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}
			if( MaterialIndex2 != -1 )
			{
				bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2);
				if(bRet)	SaveItemLog(&ItemLogParam);
			}

			bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex);
			if(bRet)	SaveItemLog(&ItemLogParam);

			_ITEM_TYPE	 type = ConvertSerial2ItemType(GemIndex);
			/*if(type.m_Quality>3)
			{
				type.m_Quality -= 3;
				ITEM_LOG_PARAM	ItemLogParam;
				ItemLogParam.OpType		= ITEM_CREATE_REMOVE_GEM;
				ItemLogParam.CharGUID	= pHuman->GetGUID();
				ItemLogParam.SceneID	= pHuman->getScene()->SceneID();
				ItemLogParam.XPos		= pHuman->getWorldPos()->m_fX;
				ItemLogParam.ZPos		= pHuman->getWorldPos()->m_fZ;
				UINT GemBagIndex_Temp = GemBagIndex;
				HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER);
			}*/

			Msg.setItemTableIndex( GemIndex );
			Msg.setBagIndex( GemBagIndex );
			pGamePlayer->SendPacket( &Msg );
		}
		return OR_FAILURE;
	default:
		Assert(FALSE);
		return OR_ERROR;
	}

__LEAVE_FUNCTION

	return OR_ERROR;
}