Ejemplo n.º 1
0
UINT CGCharUseSkillHandler::Execute( CGCharUseSkill* pPacket, Player* pPlayer )
{
__ENTER_FUNCTION
    GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ;
    Assert( pGamePlayer != NULL ) ;
    if ( pGamePlayer == NULL )
    {
        g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error (pGamePlayer == NULL) " ) ;
        return PACKET_EXE_CONTINUE ;
    }

    Obj_Human* pHuman = pGamePlayer->GetHuman() ;
    Assert( pHuman != NULL ) ;
    if ( pHuman == NULL )
    {
        g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error (pHuman == NULL) " ) ;
        return PACKET_EXE_CONTINUE ;
    }

    Scene* pScene = pHuman->getScene() ;
    Assert( pScene != NULL ) ;
    if ( pScene == NULL )
    {
        g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error Obj = %d (pScene == NULL) ", pHuman->GetID() ) ;
        return PACKET_EXE_CONTINUE ;
    }

    //检查线程执行资源是否正确
    Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ;
    if ( MyGetCurrentThreadID() != pScene->m_ThreadID )
    {
        g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error Obj = %d (MyGetCurrentThreadID() != pScene->m_ThreadID) ", pHuman->GetID() ) ;
        return PACKET_EXE_CONTINUE ;
    }

    ObjID_t ObjID            = pHuman->GetID() ;
    SkillID_t idSkill        = pPacket->getSkillDataID() / 100;
    BYTE nLevel                = pPacket->getSkillDataID() % 100;
    ObjID_t idTarget        = pPacket->getTargetID();
    WORLD_POS posTarget        = pPacket->getTargetPos() ;
    FLOAT fDir                = pPacket->getDir() ;
    //now the target guid only use to call of human(拉人去指定位置的操作)
    GUID_t    guidTarget        = pPacket->getTargetGUID();

    Obj_Character *pTarget = (Obj_Character*)(pScene->GetObjManager()->GetObj(idTarget));
    if( pTarget )
    {
        //技能 类型
        Skill_Module::SkillTemplateData_T const* pSkillTemplate = g_SkillTemplateDataMgr.GetInstanceByID(idSkill);
        INT SkillType = pSkillTemplate->GetStandFlag();
        if (SkillType > 0)
        {    
            //相同阵营,可以释放
            if( pHuman->IsEnemy( pTarget ) == TRUE )
            {
                g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: %s and %s  isn't the same camp! ", pHuman->GetName(), pTarget->GetName() ) ;
                return    PACKET_EXE_CONTINUE;
            }
        }else if(SkillType < 0)
        {
            // 不同阵营,可以释放
            if( pHuman->IsEnemy( pTarget ) == FALSE )
            {
                g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: %s and %s  is the same camp! ", pHuman->GetName(), pTarget->GetName() ) ;
                return    PACKET_EXE_CONTINUE;
            }
        }
    }
    else
    {
        //g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGCharUseSkillHandler::ObjName=%s, ERR_OWNER_INVALID"
        //    ,pHuman->GetName()) ;
        //return PACKET_EXE_CONTINUE;
    }

    if ( pPacket->getObjID() == pHuman->GetID() )
    {
        ORESULT oResult = pHuman->GetHumanAI()->PushCommand_UseSkill( idSkill, nLevel, idTarget, posTarget.m_fX, posTarget.m_fZ, fDir, guidTarget );
        if ( OR_FAILED( oResult ) )
        {
            pHuman->SendOperateResultMsg(oResult);
        }
    }
    else
    {
        Obj_Pet *pPet = pHuman->GetPet();
        if ( pPet != NULL && pPet->GetID() == pPacket->getObjID() )
        {
            ORESULT oResult = pPet->GetPetAI()->PushCommand_UseSkill( idSkill, idTarget, posTarget.m_fX, posTarget.m_fZ, fDir, guidTarget );
            if ( OR_FAILED( oResult ) )
            {
                pHuman->SendOperateResultMsg(oResult);
            }
        }
    }

    g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: S:%d D:%d Skill:%d (%f,%f) DIR = %f", 
        pPacket->getObjID(), 
        pPacket->getTargetID(), 
        idSkill, 
        pPacket->getTargetPos().m_fX,
        pPacket->getTargetPos().m_fZ,
        fDir ) ;

    return PACKET_EXE_CONTINUE ;

__LEAVE_FUNCTION

    return PACKET_EXE_ERROR ;
}