DragonNest/Server/DNGameServer/DnDefenseMonsterActor.cpp

118 lines
3.4 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnDefenseMonsterActor.h"
#include "DnWeapon.h"
#include "DnBlow.h"
#include "DnPlayerActor.h"
#include "DnStateBlow.h"
CDnDefenseMonsterActor::CDnDefenseMonsterActor( CMultiRoom *pRoom, int nClassID )
: CDnNormalMonsterActor( pRoom, nClassID )
{
m_nDefenseProb = 0;
m_bCrashDefense = false;
}
CDnDefenseMonsterActor::~CDnDefenseMonsterActor()
{
}
bool CDnDefenseMonsterActor::CheckDamageAction( DnActorHandle hActor )
{
if( !m_bCrashDefense && m_hWeapon[1] && !IsDown() && !IsAir() ) {
EtVector3 vTemp = *GetPosition() - *hActor->GetPosition();
EtVec3Normalize( &vTemp, &vTemp );
float fDot = EtVec3Dot( &vTemp, &m_Cross.m_vZAxis );
int nDefenseProb = m_nDefenseProb;
if( _rand(GetRoom())%100 < nDefenseProb ) {
int nValue = m_hWeapon[1]->GetDurability();
nValue -= (int)( m_HitParam.fDurability * 100.f );
if( nValue < 0 ) nValue = 0;
m_hWeapon[1]->SetDurability( nValue );
if( nValue == 0 ) {
m_bCrashDefense = true;
DefenseWeapon( true );
m_HitParam.szActionName = "Stun";
m_fDownDelta = 3.f;
MAMovementBase *pMovement = GetMovement();
if( pMovement ) {
pMovement->ResetMove();
pMovement->ResetLook();
}
if( hActor && hActor->IsPlayerActor() ) {
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
pPlayer->UpdateBrokenShield();
}
}
else {
DefenseWeapon( false );
m_HitParam.szActionName = "Defense";
m_HitParam.vVelocity.y = 0.f;
m_HitParam.vResistance.y = 0.f;
}
//////////////////////////////////////////////////////////////////////////
// #39059 <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>з<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 179<37><39> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> OnTargetHit ó<><C3B3><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>.
if( hActor && hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_179) )
{
DNVector(DnBlowHandle) vlhBlows;
hActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_179, vlhBlows );
int iNumBlow = (int)vlhBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
DnBlowHandle hBlow = vlhBlows.at(i);
if( hBlow && hBlow->GetBlowIndex() == STATE_BLOW::BLOW_179 )
hBlow->OnTargetHit( GetMySmartPtr() );
}
}
//////////////////////////////////////////////////////////////////////////
return false;
}
}
return CDnNormalMonsterActor::CheckDamageAction( hActor );
}
void CDnDefenseMonsterActor::DefenseWeapon( bool bCrash )
{
if( bCrash ) {
if( m_hWeapon[1]->IsExistAction( "Crash" ) ) {
m_hWeapon[1]->SetActionQueue( "Crash" );
}
else m_hWeapon[1]->SetDestroy();
m_hWeapon[1]->UnlinkWeapon();
m_hWeapon[1]->SetProcess( true );
m_hWeapon[1].Identity();
m_bSelfDeleteWeapon[1] = false;
}
else {
if( m_hWeapon[1]->IsExistAction( "Defense" ) )
m_hWeapon[1]->SetActionQueue( "Defense" );
}
}
void CDnDefenseMonsterActor::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex )
{
switch( Type ) {
case STE_CanDefense:
{
CanDefenseStruct *pStruct = (CanDefenseStruct *)pPtr;
m_nDefenseProb = pStruct->nProb;
}
return;
}
CDnNormalMonsterActor::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex );
}
void CDnDefenseMonsterActor::OnDamageWriteAdditionalPacket( CPacketCompressStream *pStream )
{
int nValue = ( m_hWeapon[1] ) ? m_hWeapon[1]->GetDurability() : 0;
pStream->Write( &nValue, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
}