bool ZModule_PoisonDamage::Update(float fElapsed) { ZObject* pObj = MDynamicCast(ZObject, m_pContainer); if (!pObj) _ASSERT(0); else { // ������ ���� DAMAGE_DELAY if(ZGetGame()->GetTime()>m_fNextDamageTime) { m_fNextDamageTime+=DAMAGE_DELAY; // ������ �ް� �ִ� ����Ʈ ������ ������ ���������� ���� ���¿����� ���δ�.. if(pObj->IsDie()) { if( pObj->m_pVMesh->GetVisibility() < 0.5f ) {//����Ʈ�� Life Ÿ�ӵ� �����ϱ�... m_bOnDamage = false; return false; } } else //�����������.. { // ������� ������Ʈ�� ���⼭ �����Ϸ��������� ����� ������ �ȵ� �ϴ� �ּ�ó���Ѵ� // 5 * (1.f-fPR) �̺κж����� zitem.xml���� damage="1"�κκ��� damage="6"�� �ϴ� ���� //float fPR = 0; //float fDamage = 5 * (1.f-fPR) + (float)m_nDamage; pObj->OnDamaged(m_pOwner, pObj->GetPosition(), ZD_LIGHTNING, MWT_NONE, m_fDamage, 1); /*ZModule_HPAP *pModule = (ZModule_HPAP*)m_pContainer->GetModule(ZMID_HPAP); if(pModule) { pModule->OnDamage(m_pOwner,m_fDamage,1); // pObj->OnScream(); }*/ } } if(ZGetGame()->GetTime()>m_fNextEffectTime) { if(!pObj->IsDie()) { int nEffectLevel = GetEffectLevel()+1; m_fNextEffectTime+=EFFECT_DELAY * nEffectLevel; ZGetEffectManager()->AddEnchantPoison2( pObj ); } } } if(m_fNextDamageTime-m_fBeginTime>m_fDuration) { m_bOnDamage = false; return false; } return true; }
bool ZEffectPartsTypePos::Draw(unsigned long int nTime) { ZObject* pObj = ZGetObjectManager()->GetObject(m_uid); if(pObj) { if(pObj->m_pVMesh) { if(pObj->IsDie()) return false; m_Pos = pObj->m_pVMesh->GetBipTypePosition(m_type); // m_DirOrg = pObj->m_Direction; return ZEffectAniMesh::Draw(nTime); } } return false; }
bool ZBrain::GetUseableSkill( int *pnSkill, MUID *puidTarget, rvector *pTargetPosition) { // Get skill module ZModule_Skills *pmod = (ZModule_Skills *)m_pBody->GetModule(ZMID_SKILLS); if ( !pmod) return false; // Set value if ( puidTarget) (*puidTarget) = MUID(0,0); if (pTargetPosition) (*pTargetPosition) = rvector(0.0f,0.0f,0.0f); // Check skills for ( int i = 0; i < pmod->GetSkillCount(); i++) { ZSkill *pSkill = pmod->GetSkill( i); // Check cool time if ( !pSkill->IsReady()) continue; // Get skill description ZSkillDesc *pDesc = pmod->GetSkill( i)->GetDesc(); // 스킬의 적용 대상이 아군인 경우... if ( pDesc->IsAlliedTarget()) { // 효과가 있는 대상중 가까이 있는 걸 찾는다. float fDist = DIST_OUT; ZObject *pAlliedTarget = NULL; for ( ZObjectManager::iterator itor = ZGetObjectManager()->begin(); itor != ZGetObjectManager()->end(); ++itor) { ZObject *pObject = itor->second; // 죽은 놈은 넘어간다 if ( pObject->IsDie()) continue; // 적이면 넘어간다 if ( ZGetGame()->CanAttack(m_pBody,pObject)) continue; // 자기 자신이면 넘어간다 if ( pObject == m_pBody) continue; // Get distance float dist = MagnitudeSq( pObject->GetPosition() - m_pBody->GetPosition()); if ( pSkill->IsUsable( pObject) && ( dist < fDist)) { fDist = dist; pAlliedTarget = pObject; } } // 만약 대상이 없으면 자기 자신한테라도 스킬을 건다. if ( ( pAlliedTarget == NULL) && ( pSkill->IsUsable( m_pBody))) pAlliedTarget = m_pBody; if (pAlliedTarget) { if ( pnSkill) *pnSkill = i; if ( puidTarget) *puidTarget = pAlliedTarget->GetUID(); if ( pTargetPosition) *pTargetPosition = pAlliedTarget->GetCenterPos(); return true; } } // 스킬의 적용 대상이 적군인 경우... else { ZObject* pTarget = GetTarget(); if ( pTarget == NULL) continue; // Check useable if ( !pSkill->IsUsable( pTarget)) continue; // Get pick info ZPICKINFO pickinfo; memset( &pickinfo, 0, sizeof( ZPICKINFO)); // Check picking rvector pos, tarpos, dir; // 적과 나의 몸통 실린더에서 가슴 정도의 높이 지점끼리 피킹 쏴본다.. pos = m_pBody->GetPosition() + rvector( 0, 0, m_pBody->GetCollHeight()*0.5f*0.8f); // 가슴께로 낮춰주려고 *0.8 tarpos = pTarget->GetPosition() + rvector( 0, 0, pTarget->GetCollHeight()*0.5f*0.8f); dir = tarpos - pos; Normalize( dir); const DWORD dwPickPassFlag = RM_FLAG_ADDITIVE | RM_FLAG_HIDE | RM_FLAG_PASSROCKET | RM_FLAG_PASSBULLET; if ( ZGetGame()->Pick( m_pBody, pos, dir, &pickinfo, dwPickPassFlag)) { if ( pickinfo.pObject) { if ( pnSkill) *pnSkill = i; if ( puidTarget) *puidTarget = pTarget->GetUID(); if ( pTargetPosition) *pTargetPosition = pTarget->GetCenterPos(); return true; } } } } return false; }