void CPythonPlayerEventHandler::OnHit(UINT uSkill, CActorInstance& rkActorVictim, BOOL isSendPacket) { DWORD dwVIDVictim=rkActorVictim.GetVirtualID(); // Update Target CPythonPlayer::Instance().SetTarget(dwVIDVictim, FALSE); // Update Target if (isSendPacket) { //#define ATTACK_TIME_LOG #ifdef ATTACK_TIME_LOG static std::map<DWORD, float> s_prevTimed; float curTime = timeGetTime() / 1000.0f; bool isFirst = false; if (s_prevTimed.end() == s_prevTimed.find(dwVIDVictim)) { s_prevTimed[dwVIDVictim] = curTime; isFirst = true; } float diffTime = curTime-s_prevTimed[dwVIDVictim]; if (diffTime < 0.1f && !isFirst) { TraceError("ATTACK(SPEED_HACK): %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim); } else { TraceError("ATTACK: %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim); } s_prevTimed[dwVIDVictim] = curTime; #endif CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance(); rkStream.SendAttackPacket(uSkill, dwVIDVictim); } if (!rkActorVictim.IsPushing()) return; // 거대 몬스터 밀림 제외 extern bool IS_HUGE_RACE(unsigned int vnum); if (IS_HUGE_RACE(rkActorVictim.GetRace())) return; CPythonCharacterManager::Instance().AdjustCollisionWithOtherObjects(&rkActorVictim); const TPixelPosition& kPPosLast=rkActorVictim.NEW_GetLastPixelPositionRef(); SVictim kVictim; kVictim.m_dwVID=dwVIDVictim; kVictim.m_lPixelX=long(kPPosLast.x); kVictim.m_lPixelY=long(kPPosLast.y); rkActorVictim.TEMP_Push(kVictim.m_lPixelX, kVictim.m_lPixelY); m_kVctkVictim.push_back(kVictim); }
void CActorInstance::__HitStone(CActorInstance& rVictim) { if (rVictim.IsStun()) { rVictim.Die(); } else { rVictim.__Shake(100); } }
bool CActorInstance::__CanPushDestActor(CActorInstance& rkActorDst) { if (rkActorDst.IsBuilding()) return false; if (rkActorDst.IsDoor()) return false; if (rkActorDst.IsStone()) return false; if (rkActorDst.IsNPC()) return false; // 거대 몬스터 밀림 제외 extern bool IS_HUGE_RACE(unsigned int vnum); if (IS_HUGE_RACE(rkActorDst.GetRace())) return false; if (rkActorDst.IsStun()) return true; if (rkActorDst.__GetOwnerVID()!=GetVirtualID()) return false; if (rkActorDst.__GetOwnerTime()>3.0f) return false; return true; }
void CActorInstance::__PushCircle(CActorInstance & rVictim) { const TPixelPosition& c_rkPPosAtk=NEW_GetAtkPixelPositionRef(); D3DXVECTOR3 v3SrcPos(c_rkPPosAtk.x, -c_rkPPosAtk.y, c_rkPPosAtk.z); const D3DXVECTOR3& c_rv3SrcPos = v3SrcPos; const D3DXVECTOR3& c_rv3DstPos = rVictim.GetPosition(); D3DXVECTOR3 v3Direction; v3Direction.x = c_rv3DstPos.x - c_rv3SrcPos.x; v3Direction.y = c_rv3DstPos.y - c_rv3SrcPos.y; v3Direction.z = 0.0f; D3DXVec3Normalize(&v3Direction, &v3Direction); rVictim.__SetFallingDirection(v3Direction.x, v3Direction.y); }
void CActorInstance::__PushDirect(CActorInstance & rVictim) { D3DXVECTOR3 v3Direction; v3Direction.x = cosf(D3DXToRadian(m_fcurRotation + 270.0f)); v3Direction.y = sinf(D3DXToRadian(m_fcurRotation + 270.0f)); v3Direction.z = 0.0f; rVictim.__SetFallingDirection(v3Direction.x, v3Direction.y); }
void CActorInstance::__ProcessMotionAttackSuccess(DWORD dwMotionKey, CActorInstance & rVictim) { CRaceMotionData * c_pMotionData; if (!m_pkCurRaceData->GetMotionDataPointer(dwMotionKey, &c_pMotionData)) return; const D3DXVECTOR3& c_rv3VictimPos=rVictim.GetPositionVectorRef(); __ProcessDataAttackSuccess(c_pMotionData->GetMotionAttackDataReference(), rVictim, c_rv3VictimPos); }
void CActorInstance::__ProcessMotionEventAttackSuccess(DWORD dwMotionKey, BYTE byEventIndex, CActorInstance & rVictim) { CRaceMotionData * pMotionData; if (!m_pkCurRaceData->GetMotionDataPointer(dwMotionKey, &pMotionData)) return; if (byEventIndex >= pMotionData->GetMotionEventDataCount()) return; const CRaceMotionData::TMotionAttackingEventData * pMotionEventData; if (!pMotionData->GetMotionAttackingEventDataPointer(byEventIndex, &pMotionEventData)) return; const D3DXVECTOR3& c_rv3VictimPos=rVictim.GetPositionVectorRef(); __ProcessDataAttackSuccess(pMotionEventData->AttackData, rVictim, c_rv3VictimPos); }
void CActorInstance::__HitGreate(CActorInstance& rVictim) { // DISABLE_KNOCKDOWN_ATTACK if (rVictim.IsKnockDown()) return; if (rVictim.__IsStandUpMotion()) return; // END_OF_DISABLE_KNOCKDOWN_ATTACK float fRotRad = D3DXToRadian(GetRotation()); float fVictimRotRad = D3DXToRadian(rVictim.GetRotation()); D3DXVECTOR2 v2Normal(sin(fRotRad), cos(fRotRad)); D3DXVECTOR2 v2VictimNormal(sin(fVictimRotRad), cos(fVictimRotRad)); D3DXVec2Normalize(&v2Normal, &v2Normal); D3DXVec2Normalize(&v2VictimNormal, &v2VictimNormal); float fScalar = D3DXVec2Dot(&v2Normal, &v2VictimNormal); rVictim.__Shake(100); if (rVictim.IsUsingSkill()) return; if (rVictim.IsStun()) { if (fScalar < 0.0f) rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING); else { if (!rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING_BACK)) rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING); } rVictim.m_isRealDead=true; } else { if (fScalar < 0.0f) { if (rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING)) { rVictim.PushOnceMotion(CRaceMotionData::NAME_STAND_UP); rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); } } else { if (!rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING_BACK)) { if (rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING)) { rVictim.PushOnceMotion(CRaceMotionData::NAME_STAND_UP); rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); } } else { rVictim.PushOnceMotion(CRaceMotionData::NAME_STAND_UP_BACK); rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); } } } }
void CActorInstance::__HitGood(CActorInstance& rVictim) { if (rVictim.IsKnockDown()) return; if (rVictim.IsStun()) { rVictim.Die(); } else { rVictim.__Shake(100); if (!rVictim.isLock()) { float fRotRad = D3DXToRadian(GetRotation()); float fVictimRotRad = D3DXToRadian(rVictim.GetRotation()); D3DXVECTOR2 v2Normal(sin(fRotRad), cos(fRotRad)); D3DXVECTOR2 v2VictimNormal(sin(fVictimRotRad), cos(fVictimRotRad)); D3DXVec2Normalize(&v2Normal, &v2Normal); D3DXVec2Normalize(&v2VictimNormal, &v2VictimNormal); float fScalar = D3DXVec2Dot(&v2Normal, &v2VictimNormal); if (fScalar < 0.0f) { if (rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE)) rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); } else { if (rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_BACK)) rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); else if (rVictim.InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE)) rVictim.PushLoopMotion(CRaceMotionData::NAME_WAIT); } } } }
void CActorInstance::__ProcessDataAttackSuccess(const NRaceData::TAttackData & c_rAttackData, CActorInstance & rVictim, const D3DXVECTOR3 & c_rv3Position, UINT uiSkill, BOOL isSendPacket) { if (NRaceData::HIT_TYPE_NONE == c_rAttackData.iHittingType) return; InsertDelay(c_rAttackData.fStiffenTime); if (__CanPushDestActor(rVictim) && c_rAttackData.fExternalForce > 0.0f) { __PushCircle(rVictim); // VICTIM_COLLISION_TEST const D3DXVECTOR3& kVictimPos = rVictim.GetPosition(); rVictim.m_PhysicsObject.IncreaseExternalForce(kVictimPos, c_rAttackData.fExternalForce); //*nForceRatio/100.0f); // VICTIM_COLLISION_TEST_END } // Invisible Time if (IS_PARTY_HUNTING_RACE(rVictim.GetRace())) { if (uiSkill) // 파티 사냥 몬스터라도 스킬이면 무적시간 적용 rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime; if (m_isMain) // #0000794: [M2KR] 폴리모프 - 밸런싱 문제 타인 공격에 의한 무적 타임은 고려하지 않고 자신 공격에 의한것만 체크한다 rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime; } else // 파티 사냥 몬스터가 아닐 경우만 적용 { rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime; } // Stiffen Time rVictim.InsertDelay(c_rAttackData.fStiffenTime); // Hit Effect D3DXVECTOR3 vec3Effect(rVictim.m_x, rVictim.m_y, rVictim.m_z); // #0000780: [M2KR] 수룡 타격구 문제 extern bool IS_HUGE_RACE(unsigned int vnum); if (IS_HUGE_RACE(rVictim.GetRace())) { vec3Effect = c_rv3Position; } const D3DXVECTOR3 & v3Pos = GetPosition(); float fHeight = D3DXToDegree(atan2(-vec3Effect.x + v3Pos.x,+vec3Effect.y - v3Pos.y)); // 2004.08.03.myevan.빌딩이나 문의 경우 타격 효과가 보이지 않는다 if (rVictim.IsBuilding()||rVictim.IsDoor()) { D3DXVECTOR3 vec3Delta=vec3Effect-v3Pos; D3DXVec3Normalize(&vec3Delta, &vec3Delta); vec3Delta*=30.0f; CEffectManager& rkEftMgr=CEffectManager::Instance(); if (m_dwBattleHitEffectID) rkEftMgr.CreateEffect(m_dwBattleHitEffectID, v3Pos+vec3Delta, D3DXVECTOR3(0.0f, 0.0f, 0.0f)); } else { CEffectManager& rkEftMgr=CEffectManager::Instance(); if (m_dwBattleHitEffectID) rkEftMgr.CreateEffect(m_dwBattleHitEffectID, vec3Effect, D3DXVECTOR3(0.0f, 0.0f, fHeight)); if (m_dwBattleAttachEffectID) rVictim.AttachEffectByID(0, NULL, m_dwBattleAttachEffectID); } if (rVictim.IsBuilding()) { // 2004.08.03.빌딩의 경우 흔들리면 이상하다 } else if (rVictim.IsStone() || rVictim.IsDoor()) { __HitStone(rVictim); } else { /////////// // Motion if (NRaceData::HIT_TYPE_GOOD == c_rAttackData.iHittingType || rVictim.IsResistFallen()) { __HitGood(rVictim); } else if (NRaceData::HIT_TYPE_GREAT == c_rAttackData.iHittingType) { __HitGreate(rVictim); } else { TraceError("ProcessSucceedingAttacking: Unknown AttackingData.iHittingType %d", c_rAttackData.iHittingType); } } __OnHit(uiSkill, rVictim, isSendPacket); }