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

📄 state.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "State.h"
#include "Field.h"
#include "Player.h"
#include "PlayerManager.h"
#include "TargetFinder.h"
#include <3DEngine/3DTerrain/PathExplorer.h>
#include <SinTable.h>
#include "PublicMath.h"
#include "AIParamParser.h"


State::State() : m_pNPC(NULL)
{
}

State::~State()
{
}

VOID State::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
	__UNUSED(param1);
	__UNUSED(param2);
	__UNUSED(param3);
}

VOID State::OnExit()
{
}

VOID State::OnAIMsg( AI_MSG *pMsg )
{
	switch( pMsg->dwMsgID )
	{
	case AI_MSG_ID_FORCE_ATTACK:
		OnMsgForceAttack( pMsg );
		break;

	case AI_MSG_ID_ATTACKED:
		OnMsgAttacked( pMsg );
		break;

	case AI_MSG_ID_HELP_REQUEST:
		OnMsgHelpRequest( pMsg );
		break;

	case AI_MSG_ID_LEAVE_FIELD:
		OnMsgLeaveField( pMsg );
		break;

	case AI_MSG_ID_THRUST:
		OnMsgThrust( pMsg );
		break;

	case AI_MSG_ID_GROUP_C0MMAND:
		OnMsgGroupCommand( pMsg );

	case AI_MSG_ID_FLYING:
		OnMsgFlying( pMsg );
		break;

	case AI_MSG_ID_KNOCKDOWN:
		OnMsgKnockDown( pMsg );
		break;

	case AI_MSG_ID_STUN:
		OnMsgStun( pMsg );
		break;

	case AI_MSG_ID_LETSGO:
		OnMsgLetsGo( pMsg );
		break;

	case AI_MSG_ID_CHANGESTATE:
		OnMsgChangeState( pMsg );
		break;

	case AI_MSG_ID_ENEMY_FOUND:
		OnMsgEnemyFound( pMsg );
		break;

	case AI_MSG_ID_GROUP_MEMBER_ATTACKED:
		OnMsgGroupAttacked( pMsg );
		break;

	case AI_MSG_ID_RUNAWAY:
		OnMsgRunAway( pMsg );
		break;

	case AI_MSG_ID_CHAOS:
		OnMsgChaos( pMsg );
		break;

	case AI_MSG_ID_COMMAND_FOLLOW:
		OnMsgCommandFollow( pMsg );
		break;
	case AI_MSG_ID_USE_SKILL:
		OnMsgUseSkill( pMsg );
		break;
	default:
		LogToFile( "AIMessageLog.txt", "[State::OnAIMsg] 沥狼登瘤 臼篮 AI Message! " );
//		ASSERT( !"沥狼登瘤 臼篮 AI Message!" );
		SUNLOG( eCRITICAL_LOG,  "[State::OnAIMsg] AIMsgID doesn't exist! " );
	}
}

VOID State::OnMsgForceAttack( AI_MSG *pMsg )
{
	AI_MSG_FORCE_ATTACK *pAttackMsg = (AI_MSG_FORCE_ATTACK*)pMsg;

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	// 傍拜措惑阑 茫绰促.
	Character* pTarget = pField->FindCharacter( pAttackMsg->dwTargetKey );
	if( !pTarget )	return;

	// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
	if( !m_pNPC->IsFriend( pTarget ) )
	{
		m_pNPC->SetTargetChar( pTarget );
		m_pNPC->ChangeState( STATE_ID_TRACK );

		// 弊缝盔捞搁 弊缝 糕滚甸俊霸 利惯斑 皋技瘤 焊晨
		if( m_pNPC->IsMemberOfGroup() )
		{
			AI_MSG_ENEMY_FOUND aiMsg;
			aiMsg.dwTargetObjectKey = pAttackMsg->dwTargetKey;
			m_pNPC->SendAIMessageToGroupExceptMe( &aiMsg, sizeof(aiMsg) );
		}
	}
}

VOID State::OnMsgAttacked( AI_MSG *pMsg )
{
	AI_MSG_ATTACKED *pAttackedMsg = (AI_MSG_ATTACKED*)pMsg;

	// 弊缝盔捞搁 弊缝 糕滚甸俊霸 利惯斑 皋技瘤 焊晨
	if( m_pNPC->IsMemberOfGroup() )
	{
		AI_MSG_ENEMY_FOUND aiMsg;
		aiMsg.dwTargetObjectKey = pAttackedMsg->dwAttackerKey;
		m_pNPC->SendAIMessageToGroupExceptMe( &aiMsg, sizeof(aiMsg) );
	}

	if( m_pNPC->GetBaseInfo()->m_SpecialCondition[0].wActionType == 1 )
	{
		AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
		if( m_pNPC->GetHP() <= m_pNPC->GetMaxHP() * stAIParamInfo.m_fHELP_REQUEST_HP_PERCENT )
		{
			AI_MSG_HELP_REQUEST AIHelpMsg;
			AIHelpMsg.dwAttackerKey = pAttackedMsg->dwAttackerKey;
			AIHelpMsg.dwTargetKey = m_pNPC->GetObjectKey();

			m_pNPC->SendAIMessageAroundExceptMe( &AIHelpMsg, sizeof(AI_MSG_HELP_REQUEST) );
		}
	}

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	Character* pAttacker = pField->FindCharacter( pAttackedMsg->dwAttackerKey );
	if( !pAttacker )	return;

	// 傍拜茄 措惑阑 硅撇饭内靛俊 殿废秦霖促.
	m_pNPC->AddAttackPoint( pAttacker, 0 );
}

VOID State::OnMsgHelpRequest( AI_MSG *pMsg )
{
	AI_MSG_HELP_REQUEST *pHelpMsg = (AI_MSG_HELP_REQUEST*)pMsg;

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	Character* pAttacker = pField->FindCharacter( pHelpMsg->dwAttackerKey );
	if( !pAttacker )	return;

	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();

	// 敲饭捞绢啊 捞固 咯矾NPC肺何磐 傍拜阑 罐绊 乐栏搁 Help夸没俊 瘤盔阑 啊瘤 臼绰促.
/*	ObjectList Observers = pAttacker->GetObservers();
	if( Observers.size() >= stAIParamInfo.m_byMAX_OBSERVERS_PER_PLAYER )
	{
		return;
	}*/

	// Help 夸没俊 览翠窍绰 加己捞 乐阑 版快俊父 瘤盔阑 埃促.
	if( m_pNPC->GetDistToNewTarget( pAttacker ) <= ( m_pNPC->GetSightRange() * stAIParamInfo.m_fHELP_SIGHTRANGE_RATIO ) )
	{
		m_pNPC->SetTargetChar( pAttacker );
		m_pNPC->ChangeState( STATE_ID_HELP );
	}
}

VOID State::OnMsgLeaveField( AI_MSG *pMsg )
{
	AI_MSG_LEAVE_FIELD *pLeaveMsg = (AI_MSG_LEAVE_FIELD*)pMsg;

	m_pNPC->RemoveEnemy( pLeaveMsg->dwObjectKey );
	m_pNPC->ChangeState( STATE_ID_IDLE );
}

VOID State::OnMsgThrust( AI_MSG *pMsg )
{
	// Thrust 惑怕啊 场抄 饶俊 促款阑 矫难临 巴牢啊甫 THRUST 惑怕狼 霉锅掳 颇扼固磐肺 傈崔
	AI_MSG_THRUST *pRecvMsg = (AI_MSG_THRUST *)pMsg;		

	if( pRecvMsg->bDownAfterThrust )
	{
		m_pNPC->ChangeState( STATE_ID_THRUST, STATE_ID_KNOCKDOWN );
	}
	else
	{
		m_pNPC->ChangeState( STATE_ID_THRUST );
	}
}

VOID State::OnMsgFlying( AI_MSG *pMsg )
{
	AI_MSG_FLYING *pRecvMsg = (AI_MSG_FLYING *)pMsg;

	m_pNPC->ChangeState( STATE_ID_FLYING, (LPARAM)pRecvMsg->dwFlyingTick );
}

VOID State::OnMsgKnockDown( AI_MSG *pMsg )
{
	AI_MSG_KNOCKDOWN *pRecvMsg = (AI_MSG_KNOCKDOWN*)pMsg;

	m_pNPC->ChangeState( STATE_ID_KNOCKDOWN, (LPARAM)pRecvMsg->dwKnockDownTick );
}

VOID State::OnMsgStun( AI_MSG *pMsg )
{
	AI_MSG_STUN *pRecvMsg = (AI_MSG_STUN*)pMsg;

	m_pNPC->ChangeState( STATE_ID_KNOCKDOWN, (LPARAM)pRecvMsg->dwStunTick );
}

VOID State::OnMsgGroupCommand( AI_MSG *pMsg )
{
	AI_MSG_GROUP_C0MMAND *pGroupCmdMsg = (AI_MSG_GROUP_C0MMAND*)pMsg;

	switch( pGroupCmdMsg->byType )
	{
	case GROUP_CMD_TYPE_ATTACK:
		OnMsgGroupCommand_Attack( pGroupCmdMsg->dwTargetKey );
		break;
	case GROUP_CMD_TYPE_STOP_ATTACK:
		OnMsgGroupCommand_StopAttack();
		break;
	default:
		SUNLOG( eMIDDLE_LOG,  "[State::OnMsgGroupCommand] Wrong GroupCommand Type! " );
	}
}

VOID State::OnMsgGroupCommand_Attack( DWORD dwTargetKey )
{
	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	Character* pTargetChar = pField->FindCharacter( dwTargetKey );
	if( !pTargetChar )	return;

	m_pNPC->SetTargetChar( pTargetChar );
	m_pNPC->ChangeState( STATE_ID_HELP );
}

VOID State::OnMsgGroupCommand_StopAttack()
{
	if( m_pNPC->GetTargetChar() )
	{
		m_pNPC->GetTargetChar()->FreeEnemySlot( m_pNPC->GetTrackSlot() );
		m_pNPC->SetTrackSlot( -1 );
	}
	m_pNPC->ChangeState( STATE_ID_IDLE );
}

VOID State::OnMsgGroupAttacked( AI_MSG *pMsg )
{
/*	AI_MSG_GROUP_MEMBER_ATTACKED *pGroupMsg = (AI_MSG_GROUP_MEMBER_ATTACKED*)pMsg;

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	Character* pTargetChar = pField->FindCharacter( pGroupMsg->dwAttackerKey );
	if( !pTargetChar )	return;

	// TODO: 弊缝狼 鸥百阑 官层具摆促绊 魄窜登搁 何窍甸俊霸 疙飞

	// 货肺款 鸥百栏肺 妇捞 缠府绰瘤 八荤
	Character* pNewTarget = m_pNPC->GetGreatestAttackPointEnemy();
	if( pNewTarget != NULL )
	{	
		// 货 利阑 茫篮 版快..
		if( m_pNPC->GetDistToNewTarget( pNewTarget ) <= m_pNPC->GetAttackRange() )
		{
			m_pNPC->SetTargetChar( pNewTarget );
			m_pNPC->ChangeState( STATE_ID_ATTACK );
		}
		else
		{
			m_pNPC->SetTargetChar( pNewTarget );
			m_pNPC->ChangeState( STATE_ID_HELP );
		}

		// 何窍甸俊霸档 货肺款 利阑 傍拜窍档废 疙飞茄促.
		m_pNPC->GroupCmdAttackToGroup( pNewTarget );
	}
*/
}

VOID State::OnMsgLetsGo( AI_MSG *pMsg )
{
	AI_MSG_LETSGO *pRecvMsg = (AI_MSG_LETSGO*)pMsg;

	WzVector wvCurPos;
	m_pNPC->GetPos( &wvCurPos );
	WzVector wvDestPos	= pRecvMsg->wvDestPos;
	WzVector wvRandomDistance;

	// 府歹尔 悼老 谅钎肺 救啊扁 困秦辑 辟贸谅钎甫 促矫 茫绰促.
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	float fMoveLength = random( stAIParamInfo.m_fGROUP_FOLLOWER_MIN_RADIUS*100, stAIParamInfo.m_fGROUP_FOLLOWER_MAX_RADIUS*100 ) / 100.f;
	int iAngle = rand() % 360;
	wvRandomDistance.x = (float)( fMoveLength * FCOS(iAngle) );
	wvRandomDistance.y = (float)( fMoveLength * FSIN(iAngle) );
	wvRandomDistance.z = 0.0f;
	wvDestPos += wvRandomDistance;

	// 辨茫扁
	if( m_pNPC->MoveAndBroadcast( &wvDestPos, (eCHAR_MOVE_STATE)pRecvMsg->byMoveState ) )
	{
		return;
	}

	// 角菩矫 府歹客 悼老 谅钎肺 促矫 辨茫扁
	m_pNPC->MoveAndBroadcast( &pRecvMsg->wvDestPos, (eCHAR_MOVE_STATE)pRecvMsg->byMoveState );
}

VOID State::OnMsgChangeState( AI_MSG *pMsg )
{
	AI_MSG_CHANGESTATE *pRecvMsg = (AI_MSG_CHANGESTATE*)pMsg;

	// 泅犁绰 ReturnState肺狼 傈券父 绊妨茄促. 捞饶 促弗 惑怕肺狼 傈券捞 鞘夸且 锭 促矫 绊妨且 巴!!!
	if( pRecvMsg->byStateID == STATE_ID_RETURN )
	{
		m_pNPC->ChangeState( pRecvMsg->byStateID, pRecvMsg->byMoveState );
		m_pNPC->SetTargetChar( NULL );
	}
	else
	{
		ASSERT( ! "[State::OnMsgChangeState] 绊妨窍瘤 臼篮 惑怕函券捞促. 捞 何盒阑 促矫 混旗杭 巴!" );
	}
}

VOID State::OnMsgEnemyFound( AI_MSG *pMsg )
{
	AI_MSG_ENEMY_FOUND *pRecvMsg = (AI_MSG_ENEMY_FOUND*)pMsg;

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	Character* pTarget = pField->FindCharacter( pRecvMsg->dwTargetObjectKey );
	if( !pTarget )	return;

	// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
	if( !m_pNPC->IsFriend( pTarget ) )
	{
		m_pNPC->SetTargetChar( pTarget );
		m_pNPC->ChangeState( STATE_ID_TRACK );
	}
}

VOID State::OnMsgRunAway( AI_MSG *pMsg )
{
	AI_MSG_RUNAWAY *pRecvMsg = (AI_MSG_RUNAWAY*)pMsg;

	m_pNPC->ChangeState( STATE_ID_RUNAWAY, pRecvMsg->dwTargetKey, pRecvMsg->dwRunAwayTime );
}

VOID State::OnMsgChaos( AI_MSG *pMsg )
{
	AI_MSG_CHAOS *pRecvMsg = (AI_MSG_CHAOS*)pMsg;

	m_pNPC->ChangeState( STATE_ID_CHAOS, pRecvMsg->dwChaosTime );
}

VOID State::OnMsgCommandFollow( AI_MSG *pMsg )
{
	// 阿辆 捞惑惑怕(促款, 剐府扁, 去鄂 殿殿)啊 酒聪扼搁 IDLE 惑怕肺 汗蓖茄促.
	m_pNPC->SetTargetChar( NULL );
	m_pNPC->ChangeState( STATE_ID_IDLE );
}

VOID State::OnMsgUseSkill( AI_MSG *pMsg )
{
	AI_MSG_USE_SKILL *pSkillMsg = (AI_MSG_USE_SKILL*)pMsg;

	Field* pField = m_pNPC->GetField();
	if( !pField )		return;

	// 傍拜措惑阑 茫绰促.
	Character* pTarget = pField->FindCharacter( pSkillMsg->dwTargetKey );
	if( !pTarget )	return;

	// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
//	if( !m_pNPC->IsFriend( pTarget ) )
	{
		m_pNPC->SelectSkill( pTarget, pSkillMsg->dwSkillCode );
		m_pNPC->ChangeState( STATE_ID_TRACK );
	}
}






























⌨️ 快捷键说明

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