DragonNest/Server/DNGameServer/DnCannonMonsterActor.cpp

137 lines
4.3 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnCannonMonsterActor.h"
#include "DnProjectile.h"
#include "DnPlayerActor.h"
CDnCannonMonsterActor::CDnCannonMonsterActor( CMultiRoom *pRoom, int nClassID ) : TDnMonsterActor( pRoom, nClassID ),
m_vShootDir( 0.0f, 0.0f, 0.0f ),
m_vCannonGroundHitPos( 0.0f, 0.0f, 0.0f ),
m_vCannonTargetingDir( 0.0f, 0.0f, 0.0f )
{
m_vCannonLookDirection = GetMatEx()->m_vZAxis; // Rotha - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ.
}
CDnCannonMonsterActor::~CDnCannonMonsterActor()
{
if( m_hMasterPlayerActor )
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>( m_hMasterPlayerActor.GetPointer() );
pPlayerActor->OnCannonMonsterDie();
ClearMasterPlayerActor();
}
}
MAMovementBase* CDnCannonMonsterActor::CreateMovement()
{
MAMovementBase* pMovement = new IBoostPoolMAStaticMovement();
return pMovement;
}
void CDnCannonMonsterActor::SetMasterPlayerActor( DnActorHandle hMasterPlayerActor )
{
m_hMasterPlayerActor = hMasterPlayerActor;
SlaveOf( hMasterPlayerActor->GetUniqueID() ); // <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> ȭ<><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. <20>˾Ƽ<CBBE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SetCannonLookDirection(&GetMatEx()->m_vZAxis); // Rotha Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Look <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><> <20>ݴϴ<DDB4>.
// TODO: <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ <20>ڵ<EFBFBD>
SetTeam( hMasterPlayerActor->GetTeam() );
}
void CDnCannonMonsterActor::ClearMasterPlayerActor( void )
{
m_hMasterPlayerActor.Identity();
SetCannonLookDirection(&GetMatEx()->m_vZAxis); // Rotha Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Look <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD><EFBFBD>ݴϴ<DDB4>.
// <20><20><><EFBFBD><EFBFBD>.
SlaveRelease();
}
void CDnCannonMonsterActor::Look( EtVector2& vVec, bool bForceRotate)
{
if( bForceRotate )
{
if( EtVec2LengthSq( &vVec ) > 0.f ) {
GetMatEx()->m_vZAxis = EtVector3( vVec.x, 0.f, vVec.y );
EtVec3Normalize( &GetMatEx()->m_vZAxis, &GetMatEx()->m_vZAxis );
GetMatEx()->MakeUpCartesianByZAxis();
}
}
}
void CDnCannonMonsterActor::OnHitSuccess( LOCAL_TIME LocalTime, DnActorHandle hActor, HitStruct *pStruct )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޺<EFBFBD> <20><> CP <20><> ó<><C3B3><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ѵ<EFBFBD>.
if( m_hMasterPlayerActor && m_hMasterPlayerActor->IsPlayerActor() )
{
m_hMasterPlayerActor->OnHitSuccess( LocalTime, hActor, pStruct );
}
}
void CDnCannonMonsterActor::OnHitFinish( LOCAL_TIME LocalTime, HitStruct *pStruct )
{
if( m_hMasterPlayerActor && m_hMasterPlayerActor->IsPlayerActor() )
{
m_hMasterPlayerActor->OnHitFinish( LocalTime, pStruct );
}
}
void CDnCannonMonsterActor::OnMasterPlayerActorDie( void )
{
ClearMasterPlayerActor();
}
void CDnCannonMonsterActor::OnDie( DnActorHandle hHitter )
{
if( m_hMasterPlayerActor )
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>( m_hMasterPlayerActor.GetPointer() );
pPlayerActor->OnCannonMonsterDie();
ClearMasterPlayerActor();
}
}
void CDnCannonMonsterActor::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex )
{
switch( Type )
{
case STE_Projectile:
{
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
ProjectileStruct* pStruct = (ProjectileStruct *)pPtr;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> m_Cross <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݿ<EFBFBD><DDBF>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD>.
// <20><><EFBFBD><20>ݿ<EFBFBD><DDBF>ؼ<EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
MatrixEx LocalCross = m_Cross;
LocalCross.m_vZAxis = m_vCannonTargetingDir;
LocalCross.m_vZAxis.y = 0.0f;
EtVec3Normalize( &LocalCross.m_vZAxis, &LocalCross.m_vZAxis );
LocalCross.MakeUpCartesianByZAxis();
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD> CreateProjectile <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MatrixEx <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> Target <20><> <20><><EFBFBD>ϴ<EFBFBD>
// <20><>ƾ<EFBFBD><C6BE> <20>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
MatrixEx Temp = m_Cross;
m_Cross = LocalCross;
CDnProjectile* pProjectile = CDnProjectile::CreateProjectile( GetRoom(), GetMySmartPtr(), LocalCross, pStruct,
&m_vCannonGroundHitPos, CDnActor::Identity(), &m_vShootDir );
if( pProjectile == NULL )
return;
pProjectile->SetShooterType( GetMySmartPtr(), m_nActionIndex, nSignalIndex );
SendProjectile( pProjectile, pStruct, LocalCross, nSignalIndex );
OnProjectile( pProjectile, pStruct, LocalCross, nSignalIndex );
OnSkillProjectile( pProjectile );
m_Cross = Temp;
return;
}
break;
}
CDnMonsterActor::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex );
}