DragonNest/GameCommon/MAActorProp.cpp

176 lines
5.2 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "MAActorProp.h"
#include "DnMonsterActor.h"
#include "DnWorldActProp.h"
#include "DnActorClassDefine.h"
#include "DnTableDB.h"
#include "DnNPCActor.h"
/*
#ifndef _GAMESERVER
DWORD MAActorProp::s_dwActorPropUniqueID = 0;
vector<DnActorHandle> MAActorProp::s_vlhActorProp;
#else
#include "DNGameDataManager.h"
STATIC_DECL_INIT( MAActorProp, DWORD, s_dwActorPropUniqueID ) = { 0, };
#endif
*/
#ifdef _GAMESERVER
#include "DNGameDataManager.h"
#include "DnGameRoom.h"
#endif
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
MAActorProp::MAActorProp(void)
{
}
MAActorProp::~MAActorProp(void)
{
/*
#ifndef _GAMESERVER
vector<DnActorHandle>::iterator iter = find( s_vlhActorProp.begin(), s_vlhActorProp.end(), m_hMonster );
if( s_vlhActorProp.end() != iter )
s_vlhActorProp.erase( iter );
#endif
*/
SAFE_RELEASE_SPTR( m_hMonster );
}
#ifdef PER_ADD_PROP_TRAP_DIFFICULT_SET
bool MAActorProp::InitializeMonsterActorProp( int nMonsterTableID , BOOL bUseMonsterWeightTable /* = false*/ )
#else
bool MAActorProp::InitializeMonsterActorProp( int nMonsterTableID )
#endif
{
bool bResult = false;
CDnWorldActProp* pWorldActProp = dynamic_cast<CDnWorldActProp*>(this);
if( nMonsterTableID > 0 )
{
#ifdef _GAMESERVER
m_hMonster = CreateActor( pWorldActProp->GetRoom(), -1 );
#else
m_hMonster = CreateActor( -1, false, false, false );
#endif
if( !m_hMonster ) return false;
m_hMonster->SetProcess( false );
CDnMonsterActor *pMonster = dynamic_cast<CDnMonsterActor*>(m_hMonster.GetPointer());
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TMONSTER );
if( !pSox->IsExistItem( nMonsterTableID ) )
{
SAFE_RELEASE_SPTR( m_hMonster );
return false;
}
//#ifdef _GAMESERVER
pMonster->SetPropHandle( pWorldActProp->GetMySmartPtr() );
//#endif
pMonster->SetMonsterClassID( nMonsterTableID );
pMonster->SetLevel( pSox->GetFieldFromLablePtr( nMonsterTableID, "_Level" )->GetInteger() );
#ifdef _GAMESERVER
pMonster->InitializeRoom( pWorldActProp->GetGameRoom() );
#ifdef PER_ADD_PROP_TRAP_DIFFICULT_SET
if(bUseMonsterWeightTable)
{
// <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Prop(Trap)<29><> AI<41><49> Easy<73><79> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD>.
pMonster->SetAIDifficult(pWorldActProp->GetGameRoom()->m_StageDifficulty);
}
#endif // PER_ADD_PROP_TRAP_DIFFICULT_SET
#else
pMonster->InitializeSession( pWorldActProp->GetSession() );
#endif
m_hMonster->Initialize();
m_hMonster->SetPosition( pWorldActProp->GetMatEx()->m_vPosition );
m_hMonster->RefreshState();
m_hMonster->SetHP( m_hMonster->GetMaxHP() );
m_hMonster->SetSP( m_hMonster->GetMaxSP() );
// Note: <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD>ũ <20><><EFBFBD>̵<EFBFBD> ü<><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ..
// ScanActor <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20>־
// Hittable <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>..
m_hMonster->SetHittable( false );
m_hMonster->RemoveOctreeNode();
m_hMonster->SetActorType( CDnActorState::PropActor );
#ifdef _GAMESERVER
CMultiRoom *pRoom = m_hMonster->GetRoom();
m_hMonster->SetUniqueID( STATIC_INSTANCE_(CDnActor::s_dwUniqueCount)++ );
#else
// NOTE: <20><><EFBFBD><EFBFBD>ũ <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SC_ONDAMAGE <20><>Ŷ<EFBFBD><C5B6> <20>ް<EFBFBD><DEB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> hiiter<65><72> NULL <20><> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_hMonster->SetUniqueID( CDnActor::s_dwUniqueCount++ );
// s_vlhActorProp.push_back( m_hMonster );
#endif
pSox = GetDNTable( CDnTableDB::TMONSTER );
char szWeaponLable[32];
for( int j=0; j<2; j++ )
{
sprintf_s( szWeaponLable, "_Weapon%dIndex", j + 1 );
int nWeapon = pSox->GetFieldFromLablePtr( nMonsterTableID, szWeaponLable )->GetInteger();
if( nWeapon < 1 ) continue;
#ifdef _GAMESERVER
DnWeaponHandle hWeapon = CDnWeapon::CreateWeapon( pWorldActProp->GetRoom(), nWeapon, _rand(pWorldActProp->GetRoom()) );
#else
DnWeaponHandle hWeapon = CDnWeapon::CreateWeapon( nWeapon, _rand(/*pWorldActProp*/) );
#endif
m_hMonster->AttachWeapon( hWeapon, j, true );
bResult = true;
}
// hp <20><> 0 <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD>
if( 0 >= m_hMonster->GetHP() )
m_hMonster->SetHP( 1 );
}
// _ASSERT( bResult && "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
return bResult;
}
bool MAActorProp::InitializeNpcActorProp( int nNpcTableID )
{
CDnWorldActProp* pWorldActProp = dynamic_cast<CDnWorldActProp*>(this);
#ifdef _GAMESERVER
TNpcData* pNpcData = NULL;
pNpcData = g_pDataManager->GetNpcData(nNpcTableID);
if (pNpcData)
m_hMonster = CreateNpcActor( pWorldActProp->GetRoom(), nNpcTableID, pNpcData, pWorldActProp->GetMatEx()->m_vPosition, pWorldActProp->GetRotation()->y );
if( m_hMonster ) m_hMonster->InitializeRoom( pWorldActProp->GetGameRoom() );
#else
m_hMonster = CreateNpcActor( -1, nNpcTableID, pWorldActProp->GetMatEx()->m_vPosition, pWorldActProp->GetRotation()->y );
#endif
if( m_hMonster ) {
CDnNPCActor *pNpc = dynamic_cast<CDnNPCActor *>(m_hMonster.GetPointer());
if( pNpc ) pNpc->SetPropHandle( pWorldActProp->GetMySmartPtr() );
// m_hMonster->SetProcess( false );
#ifndef _GAMESERVER
SAFE_RELEASE_SPTR( m_hMonster->GetAniObjectHandle() );
#endif
m_hMonster->Show( true );
}
return true;
}
bool MAActorProp::CopyActorStateFromThis( DnActorHandle hActor )
{
// <20><><EFBFBD>ȸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ʿ<EFBFBD><CABF><EFBFBD>.
m_hMonster->CopyStateFromThis( /*static_cast<CDnActorState*>(hActor.GetPointer())*/hActor );
return true;
}