📄 attackstate.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 + -