DragonNest/Server/DNGameServer/DnActorClassDefine.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

242 lines
8.9 KiB
C++
Raw Permalink Blame History

#include "StdAfx.h"
#include "DnActorClassDefine.h"
#include "DnTableDB.h"
// Player
// Template
#include "TDnPlayerWarrior.h"
#include "TDnPlayerArcher.h"
#include "TDnPlayerCleric.h"
#include "TDnPlayerSoceress.h"
#ifdef PRE_ADD_LENCEA
#include "TDnPlayerLencea.h"
#endif
#ifdef PRE_ADD_MACHINA
#include "TDnPlayerMachina.h"
#endif
// Non Local
#include "DnNLPAArcher.h"
#include "DnNLPASoceress.h"
#if defined(PRE_ADD_ACADEMIC)
#include "DnNLPAAcademic.h"
#endif // #if defined(PRE_ADD_ACADEMIC)
#ifdef PRE_ADD_KALI
#include "DnNLPAKali.h"
#endif // #ifdef PRE_ADD_KALI
#if defined( PRE_ADD_ASSASSIN )
#include "DnNLPAAssassin.h"
#endif // #if defined( PRE_ADD_ASSASSIN )
// Monster
#include "DnMonsterActor.h"
#include "DnNormalMonsterActor.h"
#include "DnCannonMonsterActor.h"
#include "DnDefenseMonsterActor.h"
#include "DnGiantMonsterActor.h"
#include "DnSimpleRushMonsterActor.h"
#include "DnBasiliskMonsterActor.h"
#include "DnBeholderMonsterActor.h"
#include "DnManticoreMonsterActor.h"
#include "DnCelberosMonsterActor.h"
#include "DnClericRelicMonster.hpp"
#include "DnLotusGolemMonsterActor.h"
// Custom Monster
#include "DnGhoulMonsterActor.h"
#include "DnLamiaMonsterActor.h"
#include "DnSpittlerMonsterActor.h"
#include "DnSeadragonMonsterActor.h"
#include "DnGreenDragonMonsterActor.h"
#include "DnNormalNestBossMonsterActor.h"
// npc
#include "DnNPCActor.h"
// Prop Actor
#include "DnPropActor.h"
// Reference Actor Mathod Class
#include "MAPartsBody.h"
#include "DnActorState.h"
#include "PerfCheck.h"
#include "DnHideMonsterActor.h"
#ifdef PRE_FIX_MEMOPT_EXT
#include "DNGameDataManager.h"
#endif
DnActorHandle CreateActor( CMultiRoom *pRoom, int nActorTableID, int nTeamSetting )
{
DnActorHandle hActor;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TACTOR );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"ActorTable.ext failed\r\n");
return hActor;
}
int nDefaultTeam = 0;
if( nActorTableID == -1 )
{
hActor = (new IBoostPoolDnMonsterActor(pRoom, -1))->GetMySmartPtr();
nDefaultTeam = 1;
}
else {
if( !pSox->IsExistItem( nActorTableID ) ) return CDnActor::Identity();
CDnActorState::ActorTypeEnum ActorType = (CDnActorState::ActorTypeEnum)pSox->GetFieldFromLablePtr( nActorTableID, "_Class" )->GetInteger();
char *pName = pSox->GetFieldFromLablePtr( nActorTableID, "_StaticName" )->GetString();
switch( ActorType ) {
case CDnActorState::Warrior: hActor = (new TDnPlayerWarrior<CDnPlayerActor>(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Archer: hActor = (new CDnNLPAArcher(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Soceress: hActor = (new CDnNLPASoceress(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Cleric: hActor = (new TDnPlayerCleric<CDnPlayerActor>(pRoom, nActorTableID))->GetMySmartPtr(); break;
#if defined(PRE_ADD_ACADEMIC)
case CDnActorState::Academic: hActor = (new CDnNLPAAcademic(pRoom, nActorTableID))->GetMySmartPtr(); break;
#endif // #if defined(PRE_ADD_ACADEMIC)
#ifdef PRE_ADD_KALI
case CDnActorState::Kali: hActor = (new CDnNLPAKali(pRoom, nActorTableID))->GetMySmartPtr(); break;
#endif // #ifdef PRE_ADD_KALI
#if defined( PRE_ADD_ASSASSIN )
case CDnActorState::Assassin: hActor = (new CDnNLPAAssassin(pRoom, nActorTableID))->GetMySmartPtr(); break;
#endif // #if defined( PRE_ADD_ASSASSIN )
#ifdef PRE_ADD_LENCEA
case CDnActorState::Lencea: hActor = (new TDnPlayerLencea<CDnPlayerActor>(pRoom, nActorTableID))->GetMySmartPtr(); break;
#endif // #ifdef PRE_ADD_ASSASSIN
#ifdef PRE_ADD_MACHINA
case CDnActorState::Machina: hActor = (new TDnPlayerMachina<CDnPlayerActor>(pRoom, nActorTableID))->GetMySmartPtr(); break;
#endif
case CDnActorState::Defense:
if( strstr( pName, "Lamia" ) ) {
hActor = (new CDnLamiaMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
hActor = (new IBoostPoolDnDefenseMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
case CDnActorState::SimpleRush:
if( strstr( pName, "Ghoul" ) ) {
hActor = (new CDnGhoulMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
else if( strstr( pName, "Spittler" ) )
{
hActor = (new CDnSpittlerMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
else if( strstr( pName, "Cleric_Relic" ) )
{
hActor = (new CDnClericRelicMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
else if (strstr(pName, "HideMonster"))
{
hActor = (new CDnHideMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
#if defined( PRE_ADD_ACADEMIC )
else if (strstr(pName, "Academic_Automat"))
{
hActor = (new CDnAcademicAutomatMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
#endif // #if defined( PRE_ADD_ACADEMIC )
hActor = (new IBoostPoolDnSimpleRushMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
case CDnActorState::Normal:
case CDnActorState::Disturbance:
case CDnActorState::Range:
case CDnActorState::Rush:
case CDnActorState::Magic:
case CDnActorState::Trap:
case CDnActorState::NoAggro:
{
hActor = (new IBoostPoolDnNormalMonsterActor(pRoom, nActorTableID))->GetMySmartPtr();
break;
}
case CDnActorState::NoAggroTrap:
{
hActor = (new CDnNoAggroTrapMonsterActor(pRoom,nActorTableID))->GetMySmartPtr();
break;
}
case CDnActorState::Cannon: hActor = (new CDnCannonMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Crocodile: //rlkt_test crocodile
case CDnActorState::Giant: hActor = (new CDnGiantMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Basilisk: hActor = (new CDnBasiliskMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Beholder: hActor = (new CDnBeholderMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Manticore: hActor = (new CDnManticoreMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Cerberos: hActor = (new CDnCelberosMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::SeaDragon: hActor = (new CDnSeadragonMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::GreenDragon: hActor = (new CDnGreenDragonMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::LotusGolem: hActor = (new CDnLotusGolemMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Vehicle : hActor = (new CDnVehicleActor(pRoom,nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::Npc: hActor = (new CDnNPCActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::PropActor: hActor = (new CDnPropActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
case CDnActorState::NESTBOSS: hActor = (new CDnNormalNestBossMonsterActor(pRoom, nActorTableID))->GetMySmartPtr(); break;
default:
return CDnActor::Identity();
}
#ifdef PRE_FIX_MEMOPT_EXT
char* szSkinName = NULL, *szAniName = NULL, *szActName = NULL;
DNTableFileFormat* pFileNameSox = GetDNTable( CDnTableDB::TFILE );
if (g_pDataManager && pFileNameSox)
{
szSkinName = g_pDataManager->GetFileNameFromFileEXT(pSox, nActorTableID, "_SkinName", pFileNameSox);
szAniName = g_pDataManager->GetFileNameFromFileEXT(pSox, nActorTableID, "_AniName", pFileNameSox);
szActName = g_pDataManager->GetFileNameFromFileEXT(pSox, nActorTableID, "_ActName", pFileNameSox);
}
#else
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>!!
char* szSkinName = pSox->GetFieldFromLablePtr( nActorTableID, "_SkinName" )->GetString();
char* szAniName = pSox->GetFieldFromLablePtr( nActorTableID, "_AniName" )->GetString();
char* szActName = pSox->GetFieldFromLablePtr( nActorTableID, "_ActName" )->GetString();
#endif
if( !szAniName || !szActName )
{
SAFE_RELEASE_SPTR( hActor );
return CDnActor::Identity();
}
if( hActor->bIsSingleBody() )
{
if( !szSkinName ) {
SAFE_RELEASE_SPTR( hActor );
return CDnActor::Identity();
}
hActor->LoadSkin( CEtResourceMng::GetInstance().GetFullName( szSkinName ).c_str(), CEtResourceMng::GetInstance().GetFullName( szAniName ).c_str() );
}
else if( hActor->bIsPartsBody() )
{
hActor->LoadSkin( CEtResourceMng::GetInstance().GetFullName( szSkinName ).c_str(), CEtResourceMng::GetInstance().GetFullName( szAniName ).c_str() );
}
hActor->LoadAction( CEtResourceMng::GetInstance().GetFullName( szActName ).c_str() );
// <20><> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD>
if ( nTeamSetting < 0 )
{
if( ActorType <= CDnActorState::Reserved6 ) nDefaultTeam = 0;
else nDefaultTeam = 1;
}
else nDefaultTeam = nTeamSetting;
}
#if defined( STRESS_TEST )
static int iStaticTeam = 0;
nDefaultTeam = ++iStaticTeam;
#endif
hActor->SetTeam( nDefaultTeam );
hActor->SetMovement( hActor->CreateMovement() );
hActor->GetMovement()->CMultiElement::Initialize( pRoom );
hActor->GetMovement()->Initialize( hActor.GetPointer(), hActor->GetMatEx() );
return hActor;
}