本文整理汇总了C++中CMover::IsDie方法的典型用法代码示例。如果您正苦于以下问题:C++ CMover::IsDie方法的具体用法?C++ CMover::IsDie怎么用?C++ CMover::IsDie使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMover
的用法示例。
在下文中一共展示了CMover::IsDie方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetMover
// AI가 제어할 수 있는가?
BOOL CAIMonster2::IsControllable()
{
CMover* pMover = GetMover();
// 죽었을 경우 or 데미지 플라이 상태?
if( pMover->IsDie() || (pMover->m_pActMover->GetState() & OBJSTA_DMG_FLY_ALL) )
return FALSE;
return TRUE;
}
示例2:
//
// 비행중 공격 액션 처리
//
void CActionMover::_ProcessStateAttack2( DWORD dwState, int nParam )
{
CMover* pMover = m_pMover;
CModelObject *pModel = (CModelObject *)pMover->m_pModel;
switch( dwState )
{
case OBJSTA_ATK1:
if( pModel->IsEndFrame() )
ResetState( OBJSTA_ATK_ALL );
if( pModel->m_nPause > 0 )
{
--pModel->m_nPause;
}
else
{
if( pModel->IsAttrHit() )
{
CMover* pHitObj = prj.GetMover( m_objidHit );
if( IsInvalidObj( pHitObj ) || pHitObj->IsDie() ) // 타겟이 거시기하거나 죽었으면 취소
return;
BOOL bSuccess = pHitObj->m_pActMover->SendDamage( AF_GENERIC, pMover->GetId() );
if( bSuccess == FALSE )
return;
#ifdef __CLIENT
ItemProp* pItemProp = pMover->GetActiveHandItemProp();
if( pItemProp )
{
D3DXVECTOR3 v = pMover->GetPos();
PLAYSND( pItemProp->dwSndAttack1, &v );
}
#endif
if( GetMover()->IsPlayer() )
{
pModel->m_nPause = 5; // frame 멈춤
}
else
{
pModel->m_nPause = 0; // 몬스터는 멈추지 않음
pHitObj->m_pModel->m_nPause = 0;
}
}
}
break;
}
}
示例3:
BOOL CAIMonster2::IsInValidTarget()
{
if( m_idTarget == NULL_ID )
return TRUE;
CMover* pTarget = prj.GetMover( m_idTarget );
if( IsValidObj( pTarget ) == FALSE )
return TRUE;
if( pTarget->IsDie() )
return TRUE;
if( GetMover()->IsFlyingNPC() != pTarget->m_pActMover->IsFly() )
return TRUE;
return FALSE;
}
示例4: if
BOOL CAIMonster2::SelectTarget()
{
CMover *pMover = GetMover();
CWorld *pWorld = GetWorld();
int nAttackFirstRange = pMover->GetProp()->m_nAttackFirstRange;
FLOAT fRadius = pMover->GetRadiusXZ(); // this의 반지름
FLOAT fRadiusSq = fRadius * fRadius; // 반지름Sq버전.
CMover *pLastAttacker = prj.GetMover( m_idLastAttacker );
if( IsValidObj( pLastAttacker ) && pLastAttacker->IsDie() )
{
m_idLastAttacker = NULL_ID;
pLastAttacker = NULL;
}
if( pLastAttacker == NULL ) // LastAttacker가 없어졌으면 타겟 다시 잡을 수 있도록 하자.
{
m_idLastAttacker = NULL_ID;
}
else
{
D3DXVECTOR3 vDist = pLastAttacker->GetPos() - pMover->GetPos();
FLOAT fDistSq = D3DXVec3LengthSq( &vDist ); // 목표지점까지의 거리.
if( fDistSq >= fRadiusSq * 10.0f ) // 라스트어태커가 내 반지름의 10배이상 떨어져있으면
{
// 타겟 포기
m_idLastAttacker = NULL_ID;
pLastAttacker = NULL;
}
}
m_idTarget = NULL_ID;
m_vTarget.x = m_vTarget.y = m_vTarget.z = 0; // 일단 이건 안쓰는걸로 하자.
if( m_idLastAttacker == NULL_ID ) // 아직 날 때린쉐리가 없다.
{
CMover* pTarget = NULL;
pTarget = ScanTarget( pMover, nAttackFirstRange, JOB_ALL );
if( pTarget )
{
if( pMover->IsFlyingNPC() == pTarget->m_pActMover->IsFly() ) // 위상이 같으면 OK
m_idTarget = pTarget->GetId();
else
return FALSE;
}
else
return FALSE;
}
else
{
// 날 때린 쉐리가 있다.
DWORD dwNum = xRandom( 100 ); // 0 ~ 99까지으 난수.
DWORD dwAggroRate = 50;
if( IsValidObj( pLastAttacker ) )
{
if( pLastAttacker->GetJob() == JOB_MERCENARY ) // 마지막으로 날때린 쉐리가 머서면 어그로 좀더 주자.
dwAggroRate = 70;
}
if( dwNum < dwAggroRate )
{
// dwAggroRate% 확률로 마지막으로 날 때린넘 공격.
m_idTarget = m_idLastAttacker; // 날 공격한 쉐리를 타겟으로 지정하자.
}
else if( dwNum < 75 )
{
// 50미터 반경내에서 가장 쎈넘을 잡자.
CMover *pTarget = ScanTargetStrong( pMover, (float)( nAttackFirstRange ) );
if( pTarget )
{
// this가 비행형 몬스터거나 || 타겟이 비행중이 아닐때만 공격.
if( pMover->IsFlyingNPC() == pTarget->m_pActMover->IsFly() )
m_idTarget = pTarget->GetId();
else
m_idTarget = m_idLastAttacker; // 타겟이 공격하기가 여의치 않으면 마지막으로 때린쉐리 공격하자.
}
else
m_idTarget = m_idLastAttacker; // 타겟이 공격하기가 여의치 않으면 마지막으로 때린쉐리 공격하자.
}
else if( dwNum < 100 )
{
// 오버힐하는 어시를 죽이자.
CMover *pTarget = ScanTargetOverHealer( pMover, (float)( nAttackFirstRange ) );
if( pTarget )
{
// this가 비행형 몬스터거나 || 타겟이 비행중이 아닐때만 공격.
if( pMover->IsFlyingNPC() == pTarget->m_pActMover->IsFly() )
m_idTarget = pTarget->GetId();
else
m_idTarget = m_idLastAttacker; // 타겟이 공격하기가 여의치 않으면 마지막으로 때린쉐리 공격하자.
}
else
m_idTarget = m_idLastAttacker; // 타겟이 공격하기가 여의치 않으면 마지막으로 때린쉐리 공격하자.
}
}
return TRUE;
}
示例5: if
//
// Action Message Process
// 액션 메시지를 받아 처리한다.
// 어떤 행위가 발생하는 시점에 대한 처리를 담당.
// 최적화를 위해서 이미 설정되어 있는 상태면 중복 처리 하지 않음
//
int CActionMover::ProcessActMsg1( CMover* pMover, OBJMSG dwMsg, int nParam1, int nParam2, int nParam3, int nParam4, int nParam5 )
{
CModelObject* pModel = (CModelObject*)pMover->m_pModel;
switch( dwMsg )
{
// 평화모드 제자리에 서있어라!
case OBJMSG_STAND:
#ifdef __Y_INTERFACE_VER3
if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) || (GetMoveState() == OBJSTA_LMOVE) || (GetMoveState() == OBJSTA_RMOVE) ) // 전/후진중일때 제자리에 세운다.
#else //__Y_INTERFACE_VER3
if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) ) // 전/후진중일때 제자리에 세운다.
#endif //__Y_INTERFACE_VER3
{
ResetState( OBJSTA_MOVE_ALL );
m_vDelta.x = m_vDelta.z = 0;
if( pMover->IsFlyingNPC() )
{
m_vDelta.y = 0;
pMover->SetAngleX(0);
}
}
if( GetMoveState() == OBJSTA_STAND ) return 0;
if( GetMoveState() == OBJSTA_PICKUP ) return 0;
if( IsActJump() ) return -1;
if( IsActAttack() ) return -2;
if( IsActDamage() ) return -3;
if( IsDie() ) return -4;
if( IsAction() ) return 0;
SetMoveState( OBJSTA_STAND );
pMover->SetMotion( MTI_STAND );
RemoveStateFlag( OBJSTAF_ETC );
break;
case OBJMSG_STOP:
case OBJMSG_ASTOP:
#ifdef __Y_INTERFACE_VER3
if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) || (GetMoveState() == OBJSTA_LMOVE) || (GetMoveState() == OBJSTA_RMOVE) ) // 전/후진중일때 제자리에 세운다.
#else //__Y_INTERFACE_VER3
if( (GetMoveState() == OBJSTA_FMOVE) || (GetMoveState() == OBJSTA_BMOVE) ) // 전/후진중일때 제자리에 세운다.
#endif //__Y_INTERFACE_VER3
{
ResetState( OBJSTA_MOVE_ALL );
m_vDelta.x = m_vDelta.z = 0;
if( pMover->IsFlyingNPC() )
{
m_vDelta.y = 0;
pMover->SetAngleX(0);
}
}
pMover->ClearDest();
return 0; // ControlGround에서 키입력없을때 STOP을 부르는데 거기서 리턴값을 맞추기 위해 이렇게 했음.
break;
case OBJMSG_SITDOWN:
if( GetStateFlag() & OBJSTAF_SIT ) return 0; // 이미 앉은모드면 리턴 - 플래그로 검사하지 말고 state로 직접검사하자.
if( nParam3 == 0 )
{
if( IsActJump() ) return 0;
if( IsActAttack() ) return 0;
if( IsActDamage() ) return 0;
if( IsAction() ) return 0;
#ifdef __CLIENT
if( pMover->IsActiveMover() && (pMover->m_dwReqFlag & REQ_USESKILL) ) return 0; // 서버로부터 useskill응답이 오기전까진 액션해선 안됨.
#endif // __CLIENT
}
AddStateFlag( OBJSTAF_SIT );
SendActMsg( OBJMSG_STOP );
pMover->SetMotion( MTI_SIT, ANILOOP_CONT ); // 앉기 모션시작
SetMoveState( OBJSTA_SIT );
break;
case OBJMSG_STANDUP:
if( (GetStateFlag() & OBJSTAF_SIT) == 0 ) return 0;
if( nParam3 == 0 )
{
if( IsActJump() ) return 0;
if( IsActAttack() ) return 0;
if( IsActDamage() ) return 0;
if( IsAction() ) return 0;
#ifdef __CLIENT
if( pMover->IsActiveMover() && (pMover->m_dwReqFlag & REQ_USESKILL) ) return 0; // 서버로부터 useskill응답이 오기전까진 액션해선 안됨.
#endif // __CLIENT
}
SetMoveState( OBJSTA_SIT );
AddStateFlag( OBJSTAF_SIT );
pMover->SetMotion( MTI_GETUP, ANILOOP_CONT );
break;
case OBJMSG_PICKUP:
if( IsSit() ) return 0;
if( IsAction() ) return 0;
if( IsActJump() ) return 0;
if( IsActAttack() ) return 0;
if( IsActDamage() ) return 0;
//.........这里部分代码省略.........
示例6: GetSkill
//
// 외부에서 UseSkill을 명령할땐 이것으로 호출하자.
// sutType : 스킬을 사용할때 스킬큐에서 연타로 사용한건가 일반적인 사용을 한건가.c
//
int CMover::CMD_SetUseSkill( OBJID idTarget, int nSkillIdx, SKILLUSETYPE sutType )
{
m_oaCmd = OBJACT_NONE;
TRACE( "CMD_SetUseSkill( " );
if( m_pActMover->IsFly() ) return 0; // 비행중엔 스킬사용 금지.
if( m_pActMover->IsActAttack() ) return 0;
if( m_pActMover->IsActJump() ) return 0; // 점프중엔 사용금지.
if( m_pActMover->GetState() & OBJSTA_DMG_FLY_ALL ) return 0; // 데미지 플라이중엔 스킬사용금지.
if( IsDie() ) return 0; // 죽었을때 사용금지.
LPSKILL pSkill = GetSkill( 0, nSkillIdx ); // this가 가진 스킬중 nIdx에 해당하는 스킬을 꺼낸다.
if( pSkill == NULL )
{
Error( "CMD_SetUseSkill : %s skill(%d) not found", m_szName, nSkillIdx );
return 0; //
}
ItemProp* pSkillProp = pSkill->GetProp();
if( pSkillProp == NULL ) // JobSkill 리스트에서 꺼낸 스킬의 프로퍼티를 꺼냄.
{
Error( "CMD_SetUseSkill : %s. skill(%d) property not found", m_szName, pSkill->dwSkill );
return 0; //
}
if( IsPlayer() && IsStateMode( STATE_BASEMOTION_MODE ) ) // 시전중(준비시간)일땐 사용금지.
{
#ifdef __CLIENT
g_DPlay.SendStateModeCancel( STATE_BASEMOTION_MODE, STATEMODE_BASEMOTION_CANCEL );
#endif
return 0;
}
// 도달범위 - 얼마나 가까이 근접해야하는가. 미터단위
float fArrivalRange = 0.0f;
fArrivalRange = GetAttackRange( pSkillProp->dwAttackRange );
switch( pSkillProp->dwUseChance )
{
case WUI_NOW: // 타겟팅과 상관없이 자기자신에게 쓰는 방식.
idTarget = GetId();
break;
case WUI_TARGETINGOBJ: // 셀렉트 되어 있는 타겟에게 사용.
{
#ifdef __CLIENT
CObj *pFocusObj = GetWorld()->GetObjFocus();
if( pFocusObj && pFocusObj->GetType() == OT_MOVER )
idTarget = ((CMover*)pFocusObj)->GetId();
#else
if( IsPlayer() )
idTarget = ((CUser *)this)->m_idSetTarget;
#endif // __CLIENT
}
break;
#ifdef __CLIENT
case WUI_TARGETCURSORPTZ:
{
idTarget = GetId();
CRect rect;
D3DXVECTOR3 vPos;
CWndWorld* pWndWorld;
pWndWorld = (CWndWorld*)g_WndMng.GetWndBase( APP_WORLD );
rect = pWndWorld->GetClientRect();
if( GetWorld()->ClientPointToVector( NULL, rect, pWndWorld->GetMousePoint(), &GetWorld()->m_matProj, &GetWorld()->GetCamera()->m_matView, &vPos, TRUE ) )
{
#ifdef __SKILL0517
AddSkillProp* pAddSkillProp = prj.GetAddSkillProp( pSkillProp->dwSubDefine, GetSkillLevel( pSkill ) ); // UseSkill에서 사용한 스킬의 프로퍼티 꺼냄
#else // __SKILL0517
AddSkillProp* pAddSkillProp = prj.GetAddSkillProp( pSkillProp->dwSubDefine, pSkill->dwLevel ); // UseSkill에서 사용한 스킬의 프로퍼티 꺼냄
#endif // __SKILL0517
if( pAddSkillProp == NULL )
{
Error( "CMover::OnMagicSkill : %s. add스킬(%d)의 프로퍼티가 없다.", m_szName, nSkillIdx );
return 0; // property not found
}
FLOAT fDist;
FLOAT fMaxDistSq;
D3DXVECTOR3 vDist;
fMaxDistSq = (float)pAddSkillProp->dwSkillRange;
fMaxDistSq *= fMaxDistSq;
vDist = vPos - GetPos();
fDist = D3DXVec3LengthSq( &vDist );
SetAngle( GetDegree(vPos, GetPos()) ); // 목표쪽으로 몸을 돌림.
// 텔레포트 할 위치가 멀경우 현제 스킬에 해당하는 거리로 바꿔준다
if( fDist > fMaxDistSq )
{
FLOAT fLength;
D3DXVECTOR3 vDirNor;
D3DXVec3Normalize( &vDirNor, &vDist );
//.........这里部分代码省略.........