⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 summoned.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "Summoned.h"
#include "Field.h"
#include "SummonIdle.h"
#include "TrackState.h"
#include "AttackState.h"
#include "DeadState.h"
#include "ThrustState.h"
#include "JumpState.h"
#include "FallApartState.h"
#include "RetreatState.h"
#include "FlyingState.h"
#include "KnockDownState.h"
#include "RunAwayState.h"
#include "ChaosState.h"
#include "StatusManager.h"
#include "SkillInfoParser.h"
#include "SCSkillSlotContainer.h"
#include "Player.h"
#include "SkillManager.h"
#include "SCSkillSlot.h"
#include "ObjectFactory.h"
#include "NPCStateManager.h"

Summoned::Summoned() : m_pSummoner(NULL)
{
	m_pExpireTimer = new util::Timer;

	SetObjectType( SUMMON_OBJECT );
}

Summoned::~Summoned()
{
	SAFE_DELETE( m_pExpireTimer );
}

BOOL Summoned::Init()
{	
	m_eCommandState = eSUMMON_COMMAND_DELEGATE_ATTACK;
	m_bSkillUseDelegate = FALSE;

	return NPC::Init();
}

VOID Summoned::Release()
{
	m_pSummoner = NULL;

	NPC::Release();
}

VOID Summoned::Update( DWORD dwDeltaTick )
{
	// 矫埃捞 促登搁 家戈等促.
	if( m_pExpireTimer->IsExpired() && IsAlive() )
	{
		SetHP(0);
		OnDead();
		return;
	}

	// 钮俊 阶牢 AI 皋技瘤 贸府
	AIMsgProgress();

	// 老沥 矫埃付促 傍拜 措惑 犁瘤沥(绢弊肺 贸府)
	if( m_pAggroTimer->IsExpired() && GetTargetChar() != NULL )
	{
		// 林函俊 货肺款 鸥百捞 乐栏搁 硅撇饭内靛俊 殿废阑 茄促.
		AllRegisterBattleRecord();

		if( IsOffensive() || IsDefensive() )
		{
			SelectBestTarget();
		}
	}

	m_pNPCStatusManager->Update( dwDeltaTick );

	m_pBattleRecord->Update( GetTickCount() );

	NPC::Update( dwDeltaTick );
}


VOID Summoned::SetInitialState( DWORD dwStateID, LPARAM param1 )
{
	m_pNPCStatusManager->Release();

	m_pNPCStatusManager->AddStateObject( STATE_ID_TRACK, STATE_ID_TRACK );
	m_pNPCStatusManager->AddStateObject( STATE_ID_ATTACK, STATE_ID_ATTACK );
	m_pNPCStatusManager->AddStateObject( STATE_ID_DEAD, STATE_ID_DEAD );
	m_pNPCStatusManager->AddStateObject( STATE_ID_THRUST, STATE_ID_THRUST );
	m_pNPCStatusManager->AddStateObject( STATE_ID_FLYING, STATE_ID_FLYING );
	m_pNPCStatusManager->AddStateObject( STATE_ID_KNOCKDOWN, STATE_ID_KNOCKDOWN );
	m_pNPCStatusManager->AddStateObject( STATE_ID_JUMP, STATE_ID_JUMP );
	m_pNPCStatusManager->AddStateObject( STATE_ID_FALL_APART, STATE_ID_FALL_APART );
	m_pNPCStatusManager->AddStateObject( STATE_ID_RETREAT, STATE_ID_RETREAT );
	m_pNPCStatusManager->AddStateObject( STATE_ID_RUNAWAY, STATE_ID_RUNAWAY );
	m_pNPCStatusManager->AddStateObject( STATE_ID_CHAOS, STATE_ID_CHAOS );

	m_pNPCStatusManager->AddStateObject( STATE_ID_IDLE, STATE_ID_SUMMON_IDLE );
	m_pNPCStatusManager->AddStateObject( STATE_ID_WANDER, STATE_ID_SUMMON_IDLE );
	m_pNPCStatusManager->AddStateObject( STATE_ID_RETURN, STATE_ID_SUMMON_IDLE );

	// 檬扁惑怕 汲沥
	m_pNPCStatusManager->Init( dwStateID, m_pBaseInfo->m_dwSpawnTime );

	GetStatusManager()->AllocStatus( eCHAR_STATE_ETC_DISABLE_VISION, m_pBaseInfo->m_dwSpawnTime, 0 );
}

VOID Summoned::OnEnterField( Field* pField, WzVector* pwzVec ) 
{
	Init();

	NPC::OnEnterField( pField, pwzVec );
}

VOID Summoned::OnLeaveField()
{
	NPC::OnLeaveField();
}


BOOL Summoned::OnDead()
{
	return NPC::OnDead();
}

VOID Summoned::AddSkill( SLOTCODE SkillCode )
{
	SkillScriptInfo *pNewSkill = SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	if( !pNewSkill )	return;

	// 荤侩啊瓷 胶懦 眠啊
	for( int i = 0; i < 3; ++i )
	{
		if( !m_pBaseInfo->m_wSkillCode[i] )		continue;
		
		SkillScriptInfo *pBaseSkill = SkillInfoParser::Instance()->GetSkillInfo( m_pBaseInfo->m_wSkillCode[i] );
		if( !pBaseSkill )	continue;

		// 鞍篮 辆幅狼 胶懦捞 乐绰瘤 眉农 饶 眠啊茄促.
		if( pBaseSkill->m_SkillClassCode != pNewSkill->m_SkillClassCode )	continue;
	
		m_SkillSelector.Add( SkillCode,	m_pBaseInfo->m_bySkillRate[i] );
	}
}

BOOL Summoned::DelSkill( SLOTCODE SkillCode )
{
	return m_SkillSelector.Remove( SkillCode );
}

VOID Summoned::SetSummoner( Character *pSummoner )
{
	m_pSummoner = pSummoner;
	SetSummonerKey( pSummoner->GetObjectKey() );

	if( ( pSummoner->GetObjectType() & PLAYER_OBJECT ) != PLAYER_OBJECT )	return;

	Player *pPlayer = (Player*)pSummoner;

	// 敲饭捞绢啊 啊瘤绊 乐绰 胶懦甸 吝 家券眉包访 胶懦阑 家券眉俊 眠啊茄促.
	m_SkillSelector.Release();
	for( int i = 0; i < 3; ++i )
	{
		if( !m_pBaseInfo->m_wSkillCode[i] )		continue;

		SkillScriptInfo *pBaseSkill = SkillInfoParser::Instance()->GetSkillInfo( m_pBaseInfo->m_wSkillCode[i] );
		if( !pBaseSkill )	continue;

		SCSkillSlotContainer *pContainer = pPlayer->GetSkillManager()->GetSkillSlotContainer();
		SCSkillSlot *pCurSkillSlot = pContainer->GetSkillSlotByClass( pBaseSkill->m_SkillClassCode );
		if( !pCurSkillSlot )	continue;

		m_SkillSelector.Add( pCurSkillSlot->GetCode(),	m_pBaseInfo->m_bySkillRate[i] );
	}
}

VOID Summoned::SetExpireTime( DWORD dwInterval )
{
	m_pExpireTimer->SetTimer( dwInterval );

	if( !dwInterval )
		m_pExpireTimer->DisableCheckTime();
}

VOID Summoned::SetCommandState( eSUMMON_COMMAND eCommand, DWORD dwTargetKey )
{
	switch(eCommand)
	{
	case eSUMMON_COMMAND_ATTACK:			// 傍拜瘤矫
		{
			AI_MSG_FORCE_ATTACK AIAttackMsg;
			AIAttackMsg.dwTargetKey = dwTargetKey;
			SendAIMessage( &AIAttackMsg, sizeof(AIAttackMsg) );
		}
		break;
	case eSUMMON_COMMAND_FOLLOW:			// 第蝶抚
		{
			AI_MSG_COMMAND_FOLLOW AIFollowMsg;
			SendAIMessage( &AIFollowMsg, sizeof(AIFollowMsg) );
			m_eCommandState = eCommand;
		}
		break;
	case eSUMMON_COMMAND_DELEGATE_ATTACK:	
	case eSUMMON_COMMAND_DELEGATE_DEFENSE:
		m_eCommandState = eCommand;
		break;
	case eSUMMON_COMMAND_SKILL_ATTACK:
		SetSkillUseDelegate( TRUE );
		break;
	default:
		SUNLOG( eCRITICAL_LOG, "[Summoned::SetCommandState] Invalid Command[%d] ObjKey[%d]", eCommand, GetObjectKey() );
	}
}

BOOL Summoned::CheckClassDefine( BYTE byUserType, CODETYPE dwClassDefine )
{
	if( byUserType != eSKILL_USER_SUMMONED )
		return FALSE;

	// 胶懦阑 荤侩且 荐 乐绰 某腐磐牢瘤 眉农茄促.
	if( m_pBaseInfo->m_wClass != dwClassDefine )
		return FALSE;

	return TRUE;
}





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -