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

📄 attackstate.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "AttackState.h"
#include "Field.h"
#include <PacketStruct_CG.h>
#include "BattleRecord.h"
#include "TargetFinder.h"
#include "Skill.h"
#include "SkillFactory.h"
#include "SkillInfoParser.h"
#include "CharacterFormula.h"
#include "AIParamParser.h"
#include "Summoned.h"


AttackState::AttackState()
{
	m_pActionDelay		= new util::Timer;
	m_pFallApartTimer	= new util::Timer;
	m_pRetreatTimer		= new util::Timer;
}

AttackState::~AttackState()
{
	SAFE_DELETE( m_pActionDelay );
	SAFE_DELETE( m_pFallApartTimer );
	SAFE_DELETE( m_pRetreatTimer );
}

VOID AttackState::Init()
{
}

VOID AttackState::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{							 
	State::OnEnter( param1, param2, param3 );
	
	m_pNPC->StopMoving();

	// 鸥捞赣甫 劝己拳 矫挪促.
	m_pActionDelay->SetTimer(0);
	
	m_pFallApartTimer->SetTimer( 2000 );
	m_pFallApartTimer->Reset();

	// TODO: 捞扒 饶硼 犬伏肺 甸绢啊具瞪淀窍促.
	m_pRetreatTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wRETREAT_PERIOD );

	// DoAction()阑 OnEnter俊辑 龋免窍搁 ChangeState啊 老绢朝 啊瓷己捞 乐绊 
	// 唱吝俊 公茄惑怕傈券狼 盔牢捞 瞪荐 乐栏骨肺 捞繁 内靛绰 乔窍档废 茄促! 
	// 茄 橇饭烙 词霸 阁胶磐啊 馆览茄促绊 秦辑 蠢妨龙 捞蜡绰 绝栏骨肺 老窜 昏力甫 秦初绊 捞饶 巩力啊 绝栏搁 康备 昏力秦具窃!!!
/*	
	// TODO: 傈矫雀侩 烙矫 内靛 --> Field啊 NULL捞 瞪 荐 乐绰 版快甫 茫酒具茄促.
	Character* pCurTarget = m_pNPC->GetTargetChar();
	if( pCurTarget )
	{
		if( !pCurTarget->IsDead() && pCurTarget->GetField()!=NULL)	
		{
			// 傍拜 规过 急琶登绢 乐瘤 臼栏搁 急琶
			if( m_pNPC->GetSelectedSkill() == SKILLCODE_INVALID )
			{
				m_pNPC->SelectSkill();
			}
			DoAction();
		}
	}*/
}

VOID AttackState::OnExit()
{
	State::OnExit();
}

VOID AttackState::OnUpdate( DWORD dwDeltaTick )
{	
	__UNUSED(dwDeltaTick);

	// 掉饭捞悼救 酒公巴档 救窃
	if( !m_pActionDelay->IsExpired() ) 
		return;

	Character *pTargetChar = m_pNPC->GetTargetChar();

	// 鸥百捞 NULL捞搁 磷篮 版快, 趣篮 鞘靛俊 绝栏搁 惑怕 傈捞
	if( !pTargetChar || pTargetChar->IsDead() || pTargetChar->GetField() == NULL )
	{
		m_pNPC->SetTargetChar(NULL);
		m_pNPC->ChangeState( STATE_ID_WANDER );
		return;
	}

	// Target捞 泅犁 傍拜且 荐 绝绰 惑怕扼搁(窍疵俊 栋 乐绰 惑怕) NPC绰 泪矫 傍拜阑 肛冕促.
	if( !pTargetChar->CanBeAttacked() )	
	{
		m_pNPC->ChangeState( STATE_ID_WANDER );
		return;
	}

	// 泅犁 傍拜且 荐 绝绰 惑炔捞搁 府畔 
	if( !m_pNPC->CanAttack() )				return;

	// 傍拜 规过 急琶登绢 乐瘤 臼栏搁 急琶
	if( m_pNPC->GetSelectedSkill() == SKILLCODE_INVALID )
	{
		m_pNPC->SelectSkill();
	}

	// 鸥百捞 傍拜 荤芭府甫 哈绢唱搁 眠利 惑怕肺 傈捞
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if( m_pNPC->GetDistToTarget() >= (m_pNPC->GetAttackRange()+stAIParamInfo.m_fRANGE_TOLERANCE) )
	{
		m_pNPC->ChangeState( STATE_ID_TRACK );
		return;
	}

	// 呈公 啊鳖快搁 粱 钢绢瘤扁
	if( m_pFallApartTimer->IsExpired() && m_pNPC->IsTooCloseToTarget() )
	{
		if( m_pNPC->CanFallApartFromTarget() )
		{
			m_pNPC->ChangeState( STATE_ID_FALL_APART );
			return;
		}
	}

	// 郴 傍拜芭府俊 厚秦 呈公 啊鳖快搁 炼陛 饶硼窍磊.
	if( m_pRetreatTimer->IsExpired() && m_pNPC->NeedToRetreatFromTarget() )
	{
		m_pNPC->ChangeState( STATE_ID_RETREAT );
		return;
	}

	// 老馆傍拜捞唱 胶懦傍拜阑 茄促.
	DoAction();
}

VOID AttackState::DoAction()
{
	SLOTCODE selectedSkillCode = m_pNPC->GetSelectedSkill();

	ASSERT( selectedSkillCode != SKILLCODE_INVALID );

	if( selectedSkillCode == SKILLCODE_NORMAL_ATTACK )
	{
		DoNormalAttack();
		m_pNPC->ResetSelectedSkill();
	}
	else
	{
		UseSkill( selectedSkillCode );
		m_pNPC->ResetSelectedSkill();

		// 胶懦 荤侩 饶狼 贸府
		ActionAfterUseSkill();
	}
}


VOID AttackState::DoNormalAttack()
{
	BYTE byAttackType = rand() % 2 + 1;

	DWORD dwActionDelay = 0;//某腐磐 局聪皋捞记砒俊辑 唱柯 蔼栏肺 扁裙评俊辑 胶农赋飘俊 技泼茄 蔼
	switch( byAttackType )
	{
	case 1:
		dwActionDelay = m_pNPC->GetBaseInfo()->m_wAttSpeed;
		break;
	case 2:
		dwActionDelay = m_pNPC->GetBaseInfo()->m_wAttSpeed2;
		break;
	}

	if( 0 != m_pNPC->GetPhysicalAttackSpeed() )
	{
		dwActionDelay = (DWORD)(dwActionDelay / m_pNPC->GetPhysicalAttackSpeed());
	}
	else
	{
		dwActionDelay = 1000;
		SUNLOG( eMIDDLE_LOG, "[DoNormalAttack] PhysicalAttackSpeed is 0" );
	}

	m_pActionDelay->SetTimer( dwActionDelay );
	
	m_pNPC->StopMoving();

	// 傍拜
	Character* pTargetCharacter = m_pNPC->GetTargetChar();
	SASSERT( pTargetCharacter != NULL, "[AttackState::DoNormalAttack] pTargetCharacter == NULL" );

	WORD wCriticalRatioBonus = 0;
	BOOL bCritical = FALSE;
	DAMAGETYPE wDamage = CalcNormalDamage( m_pNPC, pTargetCharacter, (eATTACK_TYPE)m_pNPC->GetBaseInfo()->m_wAttProperty, wCriticalRatioBonus, &bCritical);

	// 农府萍拿捞 磐瘤搁
	BYTE bySkillEffect = 0;
	if( bCritical )
	{
		bySkillEffect |= SKILL_EFFECT_CRITICAL;
	}

	DAMAGETYPE wResultDamage = pTargetCharacter->Damaged( m_pNPC, (eATTACK_TYPE)m_pNPC->GetBaseInfo()->m_wAttProperty, wDamage );

	m_pNPC->OnAttack( pTargetCharacter, SKILLCODE_NORMAL_ATTACK, wResultDamage );

	// NPC 泅犁 困摹 掘扁
	WzVector wvCurPos;	m_pNPC->GetPos( &wvCurPos );

	// 傍拜 菩哦阑 焊郴拎具茄促!!	
	MSG_CG_BATTLE_MONSTER_ATTACK_CMD sendMsg;
	sendMsg.m_dwObjectKey			= m_pNPC->GetObjectKey();
	sendMsg.m_dwTargetObjectKey		= pTargetCharacter->GetObjectKey();
	sendMsg.m_byAttackType			= byAttackType;
	sendMsg.m_wvCurPos				= wvCurPos;
	sendMsg.m_wDamage				= wDamage;
	sendMsg.m_wTargetHP				= (WORD)pTargetCharacter->GetHP();
	sendMsg.m_byEffect				= bySkillEffect;

	m_pNPC->SendPacketAround( &sendMsg, sizeof(sendMsg) );

	// 傍拜寸茄 NPC俊霸 AIMessage甫 朝赴促.
	AI_MSG_ATTACKED AIAttackedMsg;
	AIAttackedMsg.dwAttackerKey = m_pNPC->GetObjectKey();
	AIAttackedMsg.wDamage = wDamage;
	pTargetCharacter->SendAIMessage( &AIAttackedMsg, sizeof(AIAttackedMsg) );

#ifdef __AGGRO_TEST__

	////////////////////////////////////////////////////////////////////////////////////////////////
	//!! 烙矫抛胶飘甫 困茄 菩哦!!! => 昏力且 巴!!
	////////////////////////////////////////////////////////////////////////////////////////////////
	BattleRecord* pRecord = m_pNPC->GetBattleRecord();
	DWORD dwTotalPoint = 0;
	DWORD dwAttackPoint = 0;
	if( NULL != pRecord )
	{
		BATTLE_RECORD* pUnitRecord = pRecord->Get(pTargetCharacter->GetObjectKey());
		if(NULL != pUnitRecord )
		{
			dwTotalPoint = pUnitRecord->GetTotalPoint();
			dwAttackPoint = pUnitRecord->GetAttackPoint();
		}
		else
		{
			dwTotalPoint = 0;
			dwAttackPoint = 0;
		}

	}
	char m_TempLog[255];
	memset(m_TempLog, 0x00, 255);

	sprintf(m_TempLog, "T[%d],A[%d]", dwTotalPoint, dwAttackPoint);

	MSG_CG_CONVERSATION_FIELDCHAT_BRD chatMsg;
	chatMsg.m_byCategory = CG_CONVERSATION;
	chatMsg.m_byProtocol = CG_CONVERSATION_FIELDCHAT_BRD;
	chatMsg.m_dwObjectKey = pTargetCharacter->GetObjectKey();
	chatMsg.m_byMsgLength = 100;
	strncpy((char*)&(chatMsg.m_pszChatMsg), m_TempLog,255);

	m_pNPC->SendPacketAround( &chatMsg, chatMsg.m_byMsgLength );
	////////////////////////////////////////////////////////////////////////////////////////////////

#endif// __AGGRO_TEST__
}

BOOL AttackState::UseSkill( SLOTCODE skillCode )
{
	// 胶懦阑 荤侩啊瓷茄瘤 眉农
	RC::eSKILL_RESULT rcResult = m_pNPC->CanUseSkill( skillCode );
	if( rcResult != RC::RC_SKILL_SUCCESS )
	{
		return FALSE;
	}

	// 胶懦阑 荤侩茄促.
	m_pNPC->UseSkill( skillCode );

	// 胶懦荤侩 掉饭捞甫 霖促.
	SkillScriptInfo *pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( skillCode );
	m_pActionDelay->SetTimer( m_pNPC->GetSelectedSkillDelay() + pBaseSkillInfo->m_wSkillCasting + pBaseSkillInfo->m_wFlyingLifeTime );

	return TRUE;
}

VOID AttackState::ActionAfterUseSkill()
{
	// 家券眉啊 胶懦荤侩 疙飞葛靛老 版快俊绰 胶懦备荤 饶 Idle 惑怕肺 倒酒柯促.
	if( ( m_pNPC->GetObjectType() & SUMMON_OBJECT ) == SUMMON_OBJECT )
	{
		Summoned *pSummoned = (Summoned*)m_pNPC;

		// 敲饭捞绢啊 疙飞阑 郴妨辑 胶懦阑 备荤茄 版快啊 酒聪扼搁 惑怕函券阑 窍瘤 臼绰促.
		if( !pSummoned->IsOffensive() && pSummoned->GetSkillUseDelegate() )
		{
			pSummoned->SetSkillUseDelegate( FALSE );
			pSummoned->ChangeState( STATE_ID_IDLE );
			return;
		}
	}

	Character *pTargetChar = m_pNPC->GetTargetChar();

	// 胶懦阑 利侩茄 措惑捞 酒焙捞扼搁 鸥百阑 促矫 茫绰促.
	if( m_pNPC->IsFriend( pTargetChar ) )
	{
		pTargetChar = m_pNPC->SearchTarget();

		if( pTargetChar )
		{
			m_pNPC->SetTargetChar( pTargetChar );
			m_pNPC->ChangeState( STATE_ID_TRACK );
		}
		else
		{
			m_pNPC->ChangeState( STATE_ID_IDLE );
		}
	}
}

VOID AttackState::OnMsgHelpRequest( AI_MSG *pMsg )
{
	// 傍拜 吝牢 NPC绰 档客崔贰档 救档客淋.. 唱慧逞
}

// 傍拜吝俊绰 饭明绊 公矫
VOID AttackState::OnMsgLetsGo( AI_MSG *pMsg )
{
}

// 利惯斑 公矫
VOID AttackState::OnMsgEnemyFound( AI_MSG *pMsg )
{
}

BOOL AttackState::IsReachableSkillRange( Character* pTargetChar, float fSkillRange )
{
	if( pTargetChar )
	{
		return m_pNPC->GetDist(pTargetChar) <= fSkillRange;
	}
	else
	{
		return TRUE;
	}
}

VOID AttackState::OnMsgForceAttack( AI_MSG *pMsg )
{
	AI_MSG_FORCE_ATTACK *pAttackMsg = (AI_MSG_FORCE_ATTACK*)pMsg;

	// 泅犁 傍拜窍绊 乐绰 措惑捞扼搁 盔贰惑怕甫 蜡瘤茄促.
	Character* pCurTarget = m_pNPC->GetTargetChar();
	if( pCurTarget && pCurTarget->GetObjectKey() == pAttackMsg->dwTargetKey )
	{
		return;
	}

	State::OnMsgForceAttack( pMsg );
}












⌨️ 快捷键说明

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