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

📄 statusmanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -