📄 statusmanager.cpp
字号:
#include "stdafx.h"
#include "Ability.h"
#include "StatusManager.h"
#include "StatusFactory.h"
#include "AbilityStatus.h"
#include "SkillInfoParser.h"
#include "CharacterFormula.h"
#include "StateInfoParser.h"
#include "LowHPStatus.h"
#include "BonusDamageStatus.h"
StatusManager::StatusManager( Character *pOwner, DWORD dwMaxPoolSize )
{
m_pOwner = pOwner;
m_pStatusHashTable = new util::SolarHashTable<BaseStatus*>;
m_pStatusHashTable->Initialize( dwMaxPoolSize );
m_eCurCondition = eCHAR_CONDITION_STANDUP;
}
StatusManager::~StatusManager()
{
Release();
SAFE_DELETE( m_pStatusHashTable );
}
VOID StatusManager::Release( BOOL bAllClear )
{
BaseStatus *pStatus = NULL;
m_pStatusHashTable->SetFirst();
while( ( pStatus = m_pStatusHashTable->GetNext() ) != NULL )
{
// RecoverStatus 殿篮 某腐磐啊 唱啊扁 傈鳖瘤绰 救瘤快档废 茄促.
if( !bAllClear && !pStatus->CanRemove() )
{
continue;
}
pStatus->End();
StatusFactory::Instance()->FreeStatus( pStatus );
m_pStatusHashTable->Remove( pStatus->GetStateID() );
}
}
VOID StatusManager::Update( DWORD curTime )
{
// 某腐磐啊 捞固 磷菌栏搁
if( !m_pOwner->IsAlive() )
{
Release( FALSE );
return;
}
BaseStatus *pStatus = NULL;
m_pStatusHashTable->SetFirst();
while( ( pStatus = m_pStatusHashTable->GetNext() ) != NULL )
{
// 矫埃捞 父丰登菌栏搁
if( pStatus->IsExpired( curTime ) )
{
pStatus->SetRemove( TRUE );
Remove( (eCHAR_STATE_TYPE)pStatus->GetStateID() );
break;
}
if( !pStatus->IsExecuteTime( curTime ) ) continue;
// 林扁利牢 Status牢 版快俊父 角青茄促.
pStatus->Execute();
}
}
BaseStatus* StatusManager::OnAlloc( eCHAR_STATE_TYPE eStateID, BOOL bAbility )
{
// Status甫 货肺 且寸秦辑 眠啊茄促.
BaseStatus *pStatus = StatusFactory::Instance()->AllocStatus( eStateID, bAbility );
if( !pStatus )
{
DISPMSG( "[StatusManager] Can't Allocate AbilityStatus \n" );
return NULL;
}
// 惑怕 府胶飘俊 殿废
if( m_pStatusHashTable->Add( pStatus, eStateID ) )
{
return pStatus;
}
else
{
DISPMSG( "[StatusManager] AddStatus Fail! \n" );
StatusFactory::Instance()->FreeStatus( pStatus );
return NULL;
}
}
BaseStatus* StatusManager::AllocStatus( eCHAR_STATE_TYPE eStateID, int iExpireTime, int iPeriod )
{
// 捞固 鞍篮 惑怕啊 粮犁茄促搁 捞傈惑怕甫 力芭窍绊 货肺 眠啊茄促.
BaseStatus *pStatus = m_pStatusHashTable->GetData( eStateID );
if( pStatus )
{
if( !Remove( eStateID ) )
{
SUNLOG( eCRITICAL_LOG, "[AllocStatus] StateID(%d) Remove Fail! ", eStateID );
return NULL;
}
}
// 货肺 惑怕 且寸
if( pStatus = OnAlloc( eStateID, FALSE ) )
{
// 檬扁拳 棺 矫累 累诀
pStatus->Init( m_pOwner, eStateID, iExpireTime, iPeriod );
pStatus->Start();
}
return pStatus;
}
AbilityStatus* StatusManager::AllocAbility( Character *pAttacker, Ability *pAbility )
{
// 惑怕碍拳啊 酒聪扼搁 惑怕啊 吧副 犬伏阑 眉农茄促.
BASE_STATEINFO *pStateInfo = StateInfoParser::Instance()->GetStateInfo( pAbility->GetStateID() );
if( pStateInfo )
{
if( pStateInfo->m_byType != eSTATE_TYPE_STRENGTHENING )
{
if( !IsStatusHit( pAttacker, m_pOwner ) )
return NULL;
}
}
// 捞固 鞍篮 惑怕啊 粮犁茄促搁 快急鉴困甫 魄窜茄促.
AbilityStatus *pAbilityStatus = (AbilityStatus*)m_pStatusHashTable->GetData( pAbility->GetStateID() );
if( pAbilityStatus )
{
if( !pAbilityStatus->IsAbilityStatus() )
{
return NULL;
}
// 货肺 眠啊且 惑怕啊 快急鉴困啊 撤栏搁 公矫等促.
if( pAbilityStatus->ComparePriority( pAbility ) )
return NULL;
// 快急鉴困啊 臭促搁 扁粮 惑怕甫 力芭茄 饶 货肺捞 且寸茄促.
if( !Remove( pAbility->GetStateID() ) )
{
SUNLOG( eCRITICAL_LOG, "[AllocAbility] StateID(%d) Remove Fail! ", pAbility->GetStateID() );
return NULL;
}
}
// 货肺 惑怕 且寸
if( pAbilityStatus = (AbilityStatus*)OnAlloc( pAbility->GetStateID(), TRUE ) )
{
// AbilityStatus啊 酒聪扼搁 秦力窍绊 府畔茄促.
if( !pAbilityStatus->IsAbilityStatus() )
{
StatusFactory::Instance()->FreeStatus( pAbilityStatus );
m_pStatusHashTable->Remove( pAbility->GetStateID() );
return NULL;
}
// 檬扁拳 棺 矫累 累诀
pAbilityStatus->Init( m_pOwner, pAttacker, pAbility );
pAbilityStatus->Start();
}
return pAbilityStatus;
}
BOOL StatusManager::Remove( eCHAR_STATE_TYPE eStateID )
{
BaseStatus *pStatus = m_pStatusHashTable->GetData( eStateID );
if( pStatus && pStatus->CanRemove() )
{
// 付公府 累诀阑 秦霖促.
pStatus->End();
StatusFactory::Instance()->FreeStatus( pStatus );
m_pStatusHashTable->Remove( eStateID );
return TRUE;
}
return FALSE;
}
VOID StatusManager::UpdateReflect( Character *pAttacker, DAMAGETYPE damage )
{
BaseStatus *pStatus = NULL; AbilityStatus *pAbilityStatus = NULL;
m_pStatusHashTable->SetFirst();
while( pStatus = m_pStatusHashTable->GetNext() )
{
if( !pStatus->IsAbilityStatus() ) continue;
pAbilityStatus = (AbilityStatus*)pStatus;
if( !pAbilityStatus->IsReflectStatus() ) continue;
pAbilityStatus->DamageMirror( pAttacker, damage );
}
}
BOOL StatusManager::CanAttack()
{
// 漂沥 惑怕俊 吧啡阑 版快 傍拜 阂啊
if( FindStatus( eCHAR_STATE_DOWN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_DELAY ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STUN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STONE ) ) return FALSE;
if( FindStatus( eCHAR_STATE_SLEEP ) ) return FALSE;
if( FindStatus( eCHAR_STATE_FROZEN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_BLUR ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STEEL ) ) return FALSE;
if( FindStatus( eCHAR_STATE_THRUST ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_OBSERVER ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_RETURNING ) ) return FALSE;
return TRUE;
}
BOOL StatusManager::CanBeAttacked()
{
// 漂沥 惑怕俊 吧啡阑 版快 傍拜阑 罐瘤 臼澜
if( FindStatus( eCHAR_STATE_STONE ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STEEL ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_FLYING ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_DISABLE_VISION ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_OBSERVER ) ) return FALSE;
if( FindStatus( eCHAR_STATE_ETC_RETURNING ) ) return FALSE;
return TRUE;
}
BOOL StatusManager::CanMove()
{
// 漂沥 惑怕俊 吧啡阑 版快 捞悼 阂啊
if( FindStatus( eCHAR_STATE_DOWN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_DELAY ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STUN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_STONE ) ) return FALSE;
if( FindStatus( eCHAR_STATE_SLEEP ) ) return FALSE;
if( FindStatus( eCHAR_STATE_FROZEN ) ) return FALSE;
if( FindStatus( eCHAR_STATE_HOLDING ) ) return FALSE;
if( FindStatus( eCHAR_STATE_THRUST ) ) return FALSE;
return TRUE;
}
RC::eSKILL_RESULT StatusManager::CanUseSkill()
{
if( FindStatus( eCHAR_STATE_SEALING ) )
{
// DISPMSG( "[StatusManager::CanUseSkill] Sealing State \n" );
return RC::RC_SKILL_SEALING_STATE;
}
return RC::RC_SKILL_SUCCESS;
}
BOOL StatusManager::CanEnchant()
{
// 旧扁 惑怕老 锭 牢忙飘, 珐农诀 包访 阂啊
if( GetCondition() == eCHAR_CONDITION_SITDOWN ) return FALSE;
return TRUE;
}
BOOL StatusManager::CanThrustDown()
{
if( GetCondition() == eCHAR_CONDITION_SITDOWN ) return FALSE;
return TRUE;
}
VOID StatusManager::Attack( DAMAGETYPE damage )
{
// 捧疙 惑怕扼搁 柄绢抄促.
if( FindStatus( eCHAR_STATE_TRANSPARENT ) )
{
Remove( eCHAR_STATE_TRANSPARENT );
}
// 傍拜 单固瘤 软荐
AbilityStatus *pStatus = (AbilityStatus*)FindStatus( eCHAR_STATE_ABSORB );
if( pStatus )
pStatus->AttackAbsorb( damage );
// 旧扁 惑怕扼搁 辑扁 惑怕肺 官诧促.
if( GetCondition() == eCHAR_CONDITION_SITDOWN )
{
SetCondition( eCHAR_CONDITION_STANDUP );
}
}
VOID StatusManager::Attacked()
{
// Sleep 惑怕扼搁 柄绢抄促.
if( FindStatus( eCHAR_STATE_SLEEP ) )
{
Remove( eCHAR_STATE_SLEEP );
}
// 旧扁 惑怕扼搁 辑扁 惑怕肺 官诧促.
if( GetCondition() == eCHAR_CONDITION_SITDOWN )
{
SetCondition( eCHAR_CONDITION_STANDUP );
}
}
VOID StatusManager::Move()
{
// 旧扁 惑怕扼搁 辑扁 惑怕肺 官诧促.
if( GetCondition() == eCHAR_CONDITION_SITDOWN )
{
SetCondition( eCHAR_CONDITION_STANDUP );
}
}
VOID StatusManager::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE &damage )
{
if( damage && m_pOwner->IsAlive() )
{
// 乔拜 单固瘤 软荐
AbilityStatus *pStatus = (AbilityStatus*)FindStatus( eCHAR_STATE_ABSORB );
if( pStatus ) pStatus->AttackedAbsorb( attackType, damage );
// 乔拜幅 惑怕 贸府
UpdateReflect( pAttacker, damage );
// 傍拜寸 眠啊 单固瘤
BonusDamageStatus *pBonusDamageStatus = (BonusDamageStatus*)FindStatus( eCHAR_STATE_STAT_DAMAGE_ADD );
if( pBonusDamageStatus ) pBonusDamageStatus->AddDamage( attackType, damage );
}
}
VOID StatusManager::ActEmotion()
{
// 旧扁 惑怕扼搁 辑扁 惑怕肺 官诧促.
if( GetCondition() == eCHAR_CONDITION_SITDOWN )
{
SetCondition( eCHAR_CONDITION_STANDUP );
}
}
VOID StatusManager::ChangeHP()
{
// HP 厚啦 炼扒俊 蝶扼 傍拜仿, 规绢仿 函拳
LowHPStatus *pStatus = (LowHPStatus*)FindStatus( eCHAR_STATE_STAT_LOWHP_ATTACK_DECREASE );
if( pStatus ) pStatus->UpdateLowHP();
pStatus = (LowHPStatus*)FindStatus( eCHAR_STATE_STAT_LOWHP_DEFENSE_DECREASE );
if( pStatus ) pStatus->UpdateLowHP();
pStatus = (LowHPStatus*)FindStatus( eCHAR_STATE_STAT_LOWHP_ATTACK_INCREASE );
if( pStatus ) pStatus->UpdateLowHP();
pStatus = (LowHPStatus*)FindStatus( eCHAR_STATE_STAT_LOWHP_DEFENSE_INCREASE );
if( pStatus ) pStatus->UpdateLowHP();
}
BYTE StatusManager::GetAllStatusInfo( STATE_INFO * OUT pStateInfoOut )
{
BYTE byCount = 0;
BaseStatus *pStatus = NULL ;
m_pStatusHashTable->SetFirst();
while( pStatus = m_pStatusHashTable->GetNext() )
{
if( !pStatus->IsAbilityStatus() ) continue;
AbilityStatus *pAbilityStatus = (AbilityStatus*)pStatus;
pStateInfoOut[byCount].m_SkillCode = pAbilityStatus->GetSkillCode();
pStateInfoOut[byCount].m_wAbilityCode = pAbilityStatus->GetAbilityID();
pStateInfoOut[byCount].m_bReflect = FALSE;
// 乔拜惑怕俊 吧赴 版快 抗寇贸府 茄促.
if( pAbilityStatus->IsReflectStatus() )
{
pStateInfoOut[byCount].m_bReflect = TRUE;
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( pAbilityStatus->GetSkillCode() );
if( !pBaseSkillInfo ) continue;
BASE_ABILITYINFO * pAbilityInfo = NULL;
pBaseSkillInfo->SetFirst();
while( pAbilityInfo = pBaseSkillInfo->GetNext() )
{
if( pAbilityInfo->m_wStateID == pAbilityStatus->GetStateID() )
{
pStateInfoOut[byCount].m_wAbilityCode = pAbilityInfo->m_wAbilityID;
break;
}
}
}
++byCount;
// taiyo : 困氰茄 内爹 函版官恩
if( byCount >= PLAYER_RENDER_INFO::MAX_STATE_INFO_SIZE ) break;
}
return byCount;
}
VOID StatusManager::ChangeCondition( eCHAR_CONDITION eCondition )
{
if( GetCondition() == eCondition ) return;
SetCondition( eCondition );
MSG_CG_STATUS_CONDITION_CHANGE_BRD BrdMsg;
BrdMsg.m_dwObjectKey = m_pOwner->GetObjectKey();
BrdMsg.m_byConditionType = eCondition;
m_pOwner->SendPacketAround( &BrdMsg, sizeof(BrdMsg) );
}
VOID StatusManager::SetCondition( eCHAR_CONDITION eCondition )
{
m_eCurCondition = eCondition;
// 惑怕俊 蝶扼辑 HP, MP 雀汗樊阑 促矫 拌魂茄促.
m_pOwner->UpdateHPMPRecover( TRUE, TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -