uint CGUseAbilityHandler::Execute(CGUseAbility* pPacket,Player* pPlayer) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer; Assert( pGamePlayer ); Obj_Human* pHuman = pGamePlayer->GetHuman(); Assert( pHuman ); Scene* pScene = pHuman->getScene(); if( pScene==NULL ) { Assert(FALSE); return PACKET_EXE_ERROR; } // 检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ); // 玩家处于不可行动状态 if( !pHuman->IsAlive() ) { // 返给玩家一条错误信息 GCAbilityResult Msg ; Msg.SetAbilityID( pPacket->GetAbilityID() ); Msg.SetPrescriptionID( pPacket->GetPrescriptionID() ); Msg.setResult( OR_DIE ) ; pGamePlayer->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } //玩家有没有别昏迷或沉默? if(FALSE==pHuman->CanActionFlag1() || FALSE==pHuman->CanActionFlag2()) { GCAbilityResult Msg ; Msg.SetAbilityID( pPacket->GetAbilityID() ); Msg.SetPrescriptionID( pPacket->GetPrescriptionID() ); Msg.setResult(OR_U_CANNT_DO_THIS_RIGHT_NOW) ; pGamePlayer->SendPacket( &Msg ); return PACKET_EXE_CONTINUE; } //玩家有没有在做别的事? if(FALSE==GetGlobalActionDelegator().CanDoNextAction(*pHuman)) { GCAbilityResult Msg ; Msg.SetAbilityID( pPacket->GetAbilityID() ); Msg.SetPrescriptionID( pPacket->GetPrescriptionID() ); Msg.setResult(OR_BUSY) ; pGamePlayer->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE; } Ability* pAbility = g_pAbilityManager->GetAbility(pPacket->GetAbilityID()); if( pAbility == NULL ) { // 不存在该技能 return PACKET_EXE_CONTINUE; } pHuman->reset_AbilityOpera(); AbilityOpera* pAbilityOpera; pAbilityOpera = pHuman->GetAbilityOpera(); pAbilityOpera->m_AbilityID = pPacket->GetAbilityID(); pAbilityOpera->m_PresID = pPacket->GetPrescriptionID(); pAbilityOpera->m_Obj = pPacket->GetPlatformGUID(); pAbilityOpera->m_nMaxTime = pAbility->OperationTime(); ORESULT res = pHuman->GetHumanAI()->PushCommand_UseAbility(); if( res == OR_OK ) { //GCAbilityAction Msg; //Msg.setObjID( pHuman->GetID() ); //Msg.setAction( pAbility->AbilityID() ); //Msg.setTargetID( pAbilityOpera->m_Obj ); //Msg.setBeginOrEnd( GCAbilityAction::ABILITY_BEGIN ); //pScene->BroadCast( &Msg, pHuman, FALSE ); } GCAbilityResult Msg; Msg.SetAbilityID( pAbilityOpera->m_AbilityID ); Msg.SetPrescriptionID( pAbilityOpera->m_PresID ); Msg.setResult( res ); pGamePlayer->SendPacket( &Msg ); g_pLog->FastSaveLog( LOG_FILE_1, "CGUseAbilityHandler AbilityID=%d PrescriptionID=%d PlatformGUID=%d Result=%d", pPacket->GetAbilityID(), pPacket->GetPrescriptionID(), pPacket->GetPlatformGUID(), res ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }