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

📄 character.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	DWORD dwRecoverMP = (DWORD)( GetMaxMP() * fRecoverMP );

	SetHP( dwRecoverHP );
	SetMP( dwRecoverMP );

	return TRUE;
}

VOID Character::OnAttack( Character *pTarget, CODETYPE skillcode, DAMAGETYPE damage )
{
	m_pStatusManager->Attack( damage );
}

VOID Character::Attacked()
{
	m_pStatusManager->Attacked();
}

DAMAGETYPE Character::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage )
{
	if( pAttacker )
	{
		m_KillerType		= pAttacker->GetObjectType();
		m_dwKillerObjectKey = pAttacker->GetObjectKey();
	}
	else
	{
		m_KillerType		= MAX_OBJECT;
		m_dwKillerObjectKey = 0;
	}

	m_pStatusManager->Damaged( pAttacker, attackType, damage );

	DAMAGETYPE wResultDamage = (DAMAGETYPE)DecreaseHP( damage );

	Attacked();

	return wResultDamage;
}

BOOL Character::CanAttack() const
{
	if( IsDead() )
	{
		return FALSE;
	}

	// 漂沥 惑怕俊 吧啡阑 版快 傍拜 阂啊
	return m_pStatusManager->CanAttack();
}

BOOL Character::CanMove()
{
	// 漂沥 惑怕俊 吧啡阑 版快 捞悼 阂啊
	return m_pStatusManager->CanMove();
}

BOOL Character::CanBeAttacked() const
{
	if ( IsDead() )
	{
		return FALSE;
	}

	// 漂沥 惑怕俊 吧啡阑 版快 傍拜阑 罐瘤 臼澜
	return m_pStatusManager->CanBeAttacked();
}

float Character::GetDist(Character* pTargetCharacter) const
{
	// 鸥百苞狼 芭府 备窍扁
	WzVector vCurPos, vTargetPos;
	GetPos( &vCurPos );
	pTargetCharacter->GetPos( &vTargetPos );

	return VectorLength( &(vTargetPos - vCurPos) );
}

float Character::GetDist(const WzVector& vTargetPos) const
{
	// 鸥百苞狼 芭府 备窍扁
	WzVector vCurPos;
	GetPos( &vCurPos );
	
	return VectorLength( &(vTargetPos - vCurPos) );
}

float Character::GetDist2( Character* pTargetCharacter ) const
{
	// 鸥百苞狼 芭府 备窍扁
	WzVector vCurPos, vTargetPos;
	GetPos( &vCurPos );
	pTargetCharacter->GetPos( &vTargetPos );

	return VectorLength2( &(vTargetPos - vCurPos) );
}

float Character::GetDist2( const WzVector& vTargetPos ) const
{
	// 鸥百苞狼 芭府 备窍扁
	WzVector vCurPos;
	GetPos( &vCurPos );

	return VectorLength2( &(vTargetPos - vCurPos) );
}

BOOL Character::IsStandingOnJumpTile()
{
	if( !GetField() )						return FALSE;

	// 泅犁 辑乐绰 鸥老 加己 掘绢郴扁

	GetField()->SetActiveRoom();
	int iTile		= GetPathExplorer()->GetTile();
	WORD wTileAttr	= GetWorldBase()->x_pPathFinder->GetAttribute( iTile );

	// 痢橇 加己捞 器窃登绢 乐绰瘤 八荤
	if( (wTileAttr & PTA_ONLY_JUMP) == 0 )	return FALSE;

	return TRUE;
}

BOOL Character::CheckArea( WzVector &vTargetPos, WzVector &vMainTargetPos, BYTE byRangeForm, float fArea )
{
	WzVector vAttackerPos;
	GetPos( &vAttackerPos );

	if( byRangeForm == SRF_FOWARD_120 )
	{
		// 120档
		WzVector diffVec = vMainTargetPos - vAttackerPos;
		if( !Math_IsPositionInFanshapedArea( &vTargetPos, &vAttackerPos, &diffVec, 120 ) )
		{
			return FALSE;
		}
	}
	else if( byRangeForm == SRF_FOWARD_160 )
	{
		// 160档
		WzVector diffVec = vMainTargetPos - vAttackerPos;
		if( !Math_IsPositionInFanshapedArea( &vTargetPos, &vAttackerPos, &diffVec, 160 ) )
		{
			return FALSE;
		}
	}
	else if( byRangeForm == SRF_PIERCE )
	{
		// 包烹
		if( Math_IsPositionInOBB( &vAttackerPos, &vMainTargetPos, fArea*2, &vTargetPos ) )
			return TRUE;
		else
			return FALSE;
	}

	// SkillArea甫 眉农茄促.(MainTarget阑 吝缴栏肺 窍绰 盔康开) ... 包烹老 版快绰 眉农窍瘤 臼绰促.
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if( fArea && Math_Vector2DLength( vMainTargetPos, vTargetPos ) >= fArea + stAIParamInfo.m_fRANGE_TOLERANCE )
	{
		return FALSE;
	}

	return TRUE;
}

// 傍拜磊 扁霖
BOOL Character::CheckSkillRange( WzVector &vTargetPos, float fSkillRange )
{
	WzVector vAttackerPos;	GetPos( &vAttackerPos );

	// 胶懦 荤芭府 魄喊(傍拜磊客 鸥百苞狼 芭府)
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if( fSkillRange && Math_Vector2DLength( vAttackerPos, vTargetPos ) >= fSkillRange + GetSkillRangeBonus() + 2*stAIParamInfo.m_fRANGE_TOLERANCE )
	{
//		SUNLOG( eFULL_LOG,  "[SkillAreaCheck] : Out of SkillRange! " );
		return FALSE;
	}
	return TRUE;
}

VOID Character::SendPacketToParty( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
	// 颇萍甫 茫绰促.
	Party *pParty = PartyManager::Instance()->FindParty( m_PartyState.GetPartyKey() );
	if( !pParty )	return;

	pParty->SendPacketAll( pMsg, wSize );
}

RC::ePACKET_SEND_RESULT Character::SendPacketAround( MSG_BASE_FORWARD * pMsg, WORD wSize, BOOL bSendToMe )
{
	if( !GetField() )	return RC::RC_SEND_FAILED;

	if( bSendToMe )
	{
		return GetField()->SendPacketAround( GetSectorIndex(), pMsg, wSize, 0 );
	}
	else
	{
		return GetField()->SendPacketAround( GetSectorIndex(), pMsg, wSize, GetObjectKey() );
	}
}

RC::ePACKET_SEND_RESULT Character::SendExPacketAround( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize, BOOL bSendToMe )
{
	if( !GetField() )	return RC::RC_SEND_FAILED;

	if( bSendToMe )
	{
		return GetField()->SendExPacketAround( GetSectorIndex(), dwNumberOfMessages, pMsg, pwSize, 0 );
	}
	else
	{
		return GetField()->SendExPacketAround( GetSectorIndex(), dwNumberOfMessages, pMsg, pwSize, GetObjectKey() );
	}
}

VOID Character::PeriodicRecover( eCHAR_STATE_TYPE eStateID, int recoverHP, int recoverMP, int iApplicationTime, int iPeriodicTime )
{
	EtcStatus *pBaseStatus = (EtcStatus*)m_pStatusManager->AllocStatus( eStateID, iApplicationTime, iPeriodicTime );
	if( pBaseStatus ) pBaseStatus->SetRegenInfo( recoverHP, recoverMP );
}

BOOL Character::OnRecover( int recoverHP, int recoverMP )
{	
	BOOL bChanged = FALSE;

	if( recoverHP > 0 )
	{
		DWORD oldHP = GetHP();
		IncreaseHP( recoverHP );
		bChanged = (oldHP != GetHP());
	}
	else if( recoverHP < 0 )
	{
		DWORD oldHP = GetHP();
		DecreaseHP( -recoverHP );
		bChanged = (oldHP != GetHP());
	}

	if( recoverMP > 0 )
	{
		DWORD oldMP = GetMP();
		IncreaseMP( recoverMP );		
		bChanged = bChanged || (oldMP != GetMP());
	}
	else if( recoverMP < 0 )
	{
		DWORD oldMP = GetMP();
		DecreaseMP( -recoverMP );
		bChanged = (oldMP != GetMP());
	}

	if( bChanged )
	{		
		MSG_CG_STATUS_RECOVER_ATTR_BRD sendMsg;
		sendMsg.m_byCategory	= CG_STATUS;
		sendMsg.m_byProtocol	= CG_STATUS_RECOVER_ATTR_BRD;
		sendMsg.m_dwObjectKey	= GetObjectKey();
		sendMsg.m_dwTargetHP	= GetHP();
		sendMsg.m_dwTargetMP	= GetMP();

		SERVER_ENV * pServerEnv = g_pGameServer->GetFileParser()->GetServerEnv();
		if( pServerEnv->bVillageRenderInfo && m_eGameZoneState == ePRS_AT_VILLAGE )
		{
			SendPacket( &sendMsg, sizeof(sendMsg) );
		}
		else
		{
			SendPacketAround( &sendMsg, sizeof(sendMsg) );
		}
	}

	return TRUE;
}

BOOL Character::CheckCondition( BYTE byCondition, WORD wParam )
{
	switch( byCondition )
	{
	case 1:
		return CheckCondition_Under_HP( wParam );
	case 2:
		return CheckCondition_Under_MP( wParam );
	case 3:
		return CheckCondition_Same_HP( wParam );
	case 4:
		return CheckCondition_Same_MP( wParam );
	}

	return FALSE;
}

// HP啊 漂沥 欺季飘 捞窍捞搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Under_HP( WORD wPercent )
{
	if( GetMaxHP() == 0 )
	{
		ASSERT( ! "MaxHP == 0" );
		return FALSE;
	}

	return GetHP() * 100 / GetMaxHP() <= wPercent;
}

// MP啊 漂沥 欺季飘 捞窍捞搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Under_MP( WORD wPercent )
{
	if( GetMaxMP() == 0 )
	{
		ASSERT( ! "MaxMP == 0" );
		return FALSE;
	}

	return GetMP() * 100 / GetMaxMP() <= wPercent;
}

// HP啊 漂沥 欺季飘客 悼老窍搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Same_HP( WORD wPercent )
{
	if( GetMaxHP() == 0 )
	{
		ASSERT( ! "MaxHP == 0" );
		return FALSE;
	}

	return GetHP() * 100 / GetMaxHP() == wPercent;
}

// MP啊 漂沥 欺季飘客 悼老窍搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Same_MP( WORD wPercent )
{
	if( GetMaxMP() == 0 )
	{
		ASSERT( ! "MaxMP == 0" );
		return FALSE;
	}
	return GetMP() * 100 / GetMaxMP() == wPercent;
}

RC::eSKILL_RESULT Character::CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset )
{
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	if( !pBaseSkillInfo )	
	{
//		SUNLOG( eFULL_LOG,  "Character : [CanUseSkill] Can't Find SkillInfo! " );
		return RC::RC_SKILL_BASEINFO_NOTEXIST;
	}

	// 傍拜且 荐 绝绰 惑炔捞扼搁
	if( !CanAttack() )
	{
		return RC::RC_SKILL_STATE_WHERE_CANNOT_ATTACK_ENEMY;
	}

	// 酿鸥烙阑 眉农茄促.
	util::Timer * pTimer = GetCoolTimer( pBaseSkillInfo->m_SkillClassCode );
	if(!pTimer)
	{
		return RC::RC_SKILL_COOLTIME_ERROR;
	}

	if( !pTimer->IsExpired( FALSE ) )
	{
		return RC::RC_SKILL_COOLTIME_ERROR;
	}

	// 鞘夸 MP, HP啊 乐绰瘤 眉农茄促.
	if( GetHP() <= pBaseSkillInfo->m_wHPSpend || GetMP() < pBaseSkillInfo->m_wMPSpend )
	{
//		SUNLOG( eFULL_LOG,  "Character : [CanUseSkill] Either HP or MP of The Player run short! " );
		return RC::RC_SKILL_HPMP_RUN_SHORT;
	}

	// 豪牢 惑怕俊 吧啡绰瘤 眉农
	RC::eSKILL_RESULT rcResult = m_pStatusManager->CanUseSkill();
	if( rcResult != RC::RC_SKILL_SUCCESS )
	{
		return rcResult;
	}

	return RC::RC_SKILL_SUCCESS;
}

VOID Character::SendAttrChange(eATTR_TYPE attrType, DWORD dwValue)
{
	MSG_CG_STATUS_ATTR_CHANGE_BRD sendMsg;
	sendMsg.m_dwObjKey = GetObjectKey();
	sendMsg.m_AttrType = (BYTE)attrType;
	sendMsg.m_dwValue = dwValue;

	SendPacketAround( &sendMsg, sizeof(sendMsg), FALSE );
}


BOOL Character::IsCoincidentWithTargetType( Character *pTarget, eSKILL_TARGET_TYPE eTargetType )
{
	switch( eTargetType )
	{
	case SKILL_TARGET_ME:		case SKILL_TARGET_REACHABLE_ME:
		{
			if( GetObjectKey() != pTarget->GetObjectKey() )	return FALSE;
		}
		break;
	case SKILL_TARGET_FRIEND:	case SKILL_TARGET_REACHABLE_FRIEND:
		{
			if( !IsFriend( pTarget ) )	return FALSE;
		}
		break;
	case SKILL_TARGET_ENEMY:	case SKILL_TARGET_REACHABLE_ENEMY:	case SKILL_TARGET_AREA:
		{
			if( IsFriend( pTarget ) )	return FALSE;
		}
		break;
	case SKILL_TARGET_FRIEND_CORPSE:
		{
			if( IsAlive() )				return FALSE;
			if( !IsFriend( pTarget ) )	return FALSE;
		}
		break;
	}

	return TRUE;
}

BOOL Character::IsStatus( eCHAR_STATE_TYPE eStateID )
{
	if( m_pStatusManager->FindStatus( eStateID ) )	
		return TRUE;
	else
		return FALSE;
}

VOID Character::ModifyPosition( WzVector &vCurPos, WzVector &vDestPos, WzVector &vResultCurPos, WzVector &vResultDestPos, SLOTCODE SkillCode )
{
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	WzVector vServerPos, vPosAfterThrust;	GetPos( &vServerPos );

	// 辑滚啊 舅绊 乐绰 敲饭捞绢狼 谅钎客 努扼捞攫飘啊 焊辰 谅钎啊 5m 捞惑 瞒捞唱绰 版快 辑滚甫 扁霖栏肺 茄促.
	float fCurPosDiff = Math_Vector2DLength( vServerPos, vCurPos );
	if( fCurPosDiff > 5.0f )
	{
		SUNLOG( eFULL_LOG, "[Player::ModifyPosition] The Server CurPos is different from the Client CurPos! CurPosDiff[%f]", fCurPosDiff );
		vResultCurPos = vServerPos;
		vResultDestPos = vServerPos;
	}
	// 努扼甫 瓜绊 敲饭捞绢狼 cur 困摹甫 嘎苗淋
	else
	{
		vResultCurPos = vCurPos;
		vResultDestPos = vDestPos;

		if( pBaseSkillInfo && pBaseSkillInfo->IsNonStopSkill() )
		{
			// 敲饭捞绢绰 肛眠瘤臼绊 拌加 瘤唱埃促.
		}
		else
		{
			// 敲饭捞绢 困摹甫 努扼啊 焊郴霖 绢琶 矫累痢栏肺 颗变促.
			SetPos( &vCurPos );
		}
	}

	// 格利瘤肺 Thrust
	if( vResultCurPos != vResultDestPos )
	{
		WzVector vDiff = vResultDestPos - vResultCurPos;
		float fThrustDist = VectorLength( &vDiff );
		ExecuteThrust( FALSE, &vDiff, vPosAfterThrust, fThrustDist );
	}
}

VOID Character::SetMoveState( eCHAR_MOVE_STATE state )
{
	m_pMoveStateControl->SetMoveState( state );
}



















⌨️ 快捷键说明

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