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