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

📄 npc.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	SASSERT( GetTargetChar(), "GetTargetChar() == NULL" );

	WzVector wvCurPos, wvTargetPos;
	GetPos( &wvCurPos );
	GetTargetChar()->GetPos( &wvTargetPos );

	// 臭捞啊 呈公 臭芭唱 呈公 撤栏搁 角菩
	float fHeight = wvCurPos.z - wvTargetPos.z;
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if( fHeight < stAIParamInfo.m_fJUMP_MIN_HEIGHT || fHeight > stAIParamInfo.m_fJUMP_MAX_HEIGHT )
	{
		return FALSE;
	}

	// 荐乞 芭府啊 呈公 钢芭唱 呈公 啊鳖快搁 角菩
	float fDistance = sqrt( ( wvTargetPos.x - wvCurPos.x ) * ( wvTargetPos.x - wvCurPos.x ) +
							( wvTargetPos.y - wvCurPos.y ) * ( wvTargetPos.y - wvCurPos.y ) );

	if( fDistance < stAIParamInfo.m_fJUMP_MIN_DISTANCE || fDistance > stAIParamInfo.m_fJUMP_MAX_DISTANCE )
	{
		return FALSE;
	}

	return TRUE;
}

BOOL NPC::JoinGroup( ObjectGroup* pGroup )
{
	// 促弗 弊缝俊 加秦乐瘤 臼酒具 茄促.
	ASSERT( m_pObjectGroup == NULL );
	ASSERT( pGroup != NULL );

	m_pObjectGroup = pGroup;

	return TRUE;
}

BOOL NPC::LeaveGroup()
{
	if( !m_pObjectGroup )	return FALSE;

	BOOL bRet = m_pObjectGroup->RemoveObject( GetObjectKey(), GetBaseInfo()->m_MonsterCode );

	if( m_pObjectGroup->GetNumberOfObjects() == 0 )
	{
		Field *pField = GetField();
		if( pField )
		{
			pField->RemoveGroup( m_pObjectGroup );
		}
	}

	m_pObjectGroup = NULL;

	return bRet;
}

BOOL NPC::IsMemberOfGroup()
{
	if( m_pObjectGroup )
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

BOOL NPC::IsLeaderOfGroup()
{
	if( !IsMemberOfGroup() )
	{
		return FALSE;
	}

	if( m_pObjectGroup->GetLeaderObjKey() != GetObjectKey() )
	{
		return FALSE;
	}

	return TRUE;
}

BOOL NPC::IsFollowerOfGroup()
{
	if( !IsMemberOfGroup() )
	{
		return FALSE;
	}

	if( m_pObjectGroup->GetLeaderObjKey() == GetObjectKey() )
	{
		return FALSE;
	}

	return TRUE;
}

BOOL NPC::IsLeaderAlive()
{
	Field *pField = GetField();
	if( !pField ) return FALSE;

	if( !m_pObjectGroup )	return FALSE;

	if( !m_pObjectGroup->GetLeaderObjKey() )	return FALSE;

	return TRUE;
}

// 辨茫扁甫 窍绊 菩哦阑 朝覆
BOOL NPC::MoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState )
{
	Field *pField = GetField();
	if( !pField ) return FALSE;

	// 辨茫扁... 角菩矫 府畔
	if( !pField->FindPath( this, pwvDestPos ) ) 
	{
		return FALSE;
	}

	SetMoveState( moveState );

	// 捞悼 菩哦阑 焊辰促.
	WzVector vMyPos;	GetPos( &vMyPos );
	MSG_CG_SYNC_MOVE_BRD sendMsg;
	sendMsg.m_byCategory			= CG_SYNC;
	sendMsg.m_byProtocol			= CG_SYNC_MOVE_BRD;
	sendMsg.m_dwObjectKey			= GetObjectKey();
	sendMsg.m_byState				= (BYTE)moveState;	// RUN or WALK
	sendMsg.wvCurPos				= vMyPos;
	sendMsg.wvDestPos				= *pwvDestPos;
	SendPacketAround( &sendMsg, sizeof(sendMsg) );

	return TRUE;
}

BOOL NPC::ThrustMoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState, BOOL &bTouchedSomething, WzVector &wvRotatedVector )
{
	Field *pField = GetField();
	if( !pField ) return FALSE;

	WzVector wvCurPos, wvDistanceWantToMove, wvDestPosAfterThrust;
	GetPos( &wvCurPos );
	wvDistanceWantToMove = *pwvDestPos - wvCurPos;
	float fWantToMoveLength = VectorLength2( &wvDistanceWantToMove );

	// 格利瘤鳖瘤 辨茫扁 版肺甫 悸泼茄促.
	if( !pField->FindPathThrust( this, &wvDistanceWantToMove ) )
	{
		return FALSE;
	}

	// FindPath饶 汲沥等 芭府啊 狼档茄 芭府俊 给固摹搁 厘局拱俊 搓篮 巴栏肺 埃林茄促.
	wvDestPosAfterThrust = GetPathExplorer()->GetTargetPos();
	float fMoveLength = VectorLength2( &(wvDestPosAfterThrust - wvCurPos) );

	// Thrust 芭府啊 狼档茄 芭府父怒 救登绰 版快
	if( fMoveLength < fWantToMoveLength * 0.95f )
	{
		// 厘局拱俊 搓疽促绰 钎矫甫 窍绊 瘤陛 啊妨绰 规氢俊辑 49档 雀傈矫挪 氦磐甫 备秦敌促.
		bTouchedSomething = TRUE;
		AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
		wvRotatedVector.x = wvDistanceWantToMove.x * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);
		wvRotatedVector.y = -wvDistanceWantToMove.x * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);			
		wvRotatedVector.z = 0.0f;

		// 捞悼 芭府啊 呈公 陋栏搁 捞悼窍瘤 富绊(菩哦 价脚 绝捞) 弊成 府畔
		if( fMoveLength < stAIParamInfo.m_fMIN_MOVABLE_DISTANCE*stAIParamInfo.m_fMIN_MOVABLE_DISTANCE )
		{
			StopMoving();
			return FALSE;
		}
	}

	SetMoveState( CMS_WALK );

	// 菩哦 焊郴扁
	MSG_CG_SYNC_MOVE_THRUST_BRD sendMsg;
	sendMsg.m_byCategory	= CG_SYNC;
	sendMsg.m_byProtocol	= CG_SYNC_MOVE_THRUST_BRD;
	sendMsg.m_dwObjectKey	= GetObjectKey();
	sendMsg.m_byState		= moveState;
	sendMsg.wTileIndex		= GetPathExplorer()->GetTile();
	sendMsg.wvCurPos		= wvCurPos;
	sendMsg.wvDestPos		= wvDestPosAfterThrust;
	SendPacketAround( &sendMsg, sizeof(sendMsg) );

	return TRUE;
}


float NPC::GetAttackRange() const
{
	if( GetSelectedSkill() == SKILLCODE_INVALID )
	{
		ASSERT( GetSelectedSkill() != SKILLCODE_INVALID );
		return 2.5f;
	}

	if( GetSelectedSkill() == SKILLCODE_NORMAL_ATTACK )
	{
		// 老馆 傍拜矫 NPC狼 扁夯 傍拜 荤芭府甫 府畔
		return m_pBaseInfo->m_fAttRange;
	}
	else
	{
		// 胶懦 傍拜矫 秦寸 胶懦狼 傍拜 荤芭府甫 府畔
		SkillScriptInfo *pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( GetSelectedSkill() );
		ASSERT( pBaseSkillInfo );
		if(NULL == pBaseSkillInfo)
		{
			SUNLOG( eCRITICAL_LOG,"[NPC::GetAttackRange] SkillInfo is NULL [%d]\n", GetSelectedSkill() );
			return 1.0f;
		}

		return pBaseSkillInfo->m_wSkillRange/10 + GetSkillRangeBonus();
	}
}

BOOL NPC::IsFriend( Character *pTarget )
{
	if( !pTarget )	return FALSE;

	// 夯牢牢瘤 眉农茄促.
	if( GetObjectKey() == pTarget->GetObjectKey() )	return TRUE;

	// 夯牢苞 鸥百狼 家券等 咯何甫 犬牢茄促.
	Character *pMySummoner = NULL; Character *pTargetSummoner = NULL;
	SummonedNPCs *pMySummon = SummonManager::Instance()->FindSummonNPCs( m_dwSummonerKey );
	SummonedNPCs *pTargetSummon = SummonManager::Instance()->FindSummonNPCs( pTarget->GetSummonerKey() );
	if( pMySummon )			
	{
		pMySummoner = pMySummon->GetSummoner();
		if( pMySummoner == this )			pMySummoner = NULL;
	}
	if( pTargetSummon )		
	{
		pTargetSummoner = pTargetSummon->GetSummoner();
		if( pTargetSummoner == pTarget )	pTargetSummoner = NULL;
	}

	if( pMySummoner && pTargetSummoner )
	{
		// 夯牢家券磊狼 鸥涝苞 鸥百家券磊狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
		return pMySummoner->IsFriend( pTargetSummoner );
	}
	else if( pMySummoner )
	{
		// 夯牢家券磊狼 鸥涝苞 鸥百狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
		return pMySummoner->IsFriend( pTarget );
	}
	else if( pTargetSummoner )
	{
		// 夯牢 鸥涝苞 鸥百家券磊狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
		return IsFriend( pTargetSummoner );
	}

	// 鞍篮 阁胶磐尝府绰 酒焙栏肺 魄沥茄促.
	if( ( pTarget->GetObjectType() & NPC_OBJECT ) == NPC_OBJECT )
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

VOID NPC::OnAttack( Character *pTarget, CODETYPE skillcode, DAMAGETYPE damage )
{
	Character::OnAttack( pTarget, skillcode, damage );

	// 弥檬肺 傍拜阑 啊茄 逞俊霸 檬扁 器牢飘甫 林扁困秦 AddAttackPoint甫 龋免茄促.
	AddAttackPoint( pTarget, 0 );
}

DAMAGETYPE NPC::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage )
{
	if( pAttacker )
	{
		AddAttackPoint( pAttacker, damage );
	}
	return Character::Damaged( pAttacker, attackType, damage );
}

VOID NPC::SpecialAction()
{
	// 老沥矫埃 埃拜栏肺 炼扒阑 眉农茄促.
	if( !m_pSkillSelectTimer->IsExpired( FALSE ) )	return;

	SPECIAL_CONDITION *pSpecialCondition = NULL;

	// 炼扒 八荤
	for( int i = 0; i < 2; ++i )
	{
		pSpecialCondition = &GetBaseInfo()->m_SpecialCondition[i];

		if( CheckCondition( pSpecialCondition->byCondition, pSpecialCondition->wConditionParam ) )
		{
			// 犬伏 眉农
			if( DrawLots( pSpecialCondition->byActionRate ) )
				break;
		}
		pSpecialCondition = NULL;
	}

	if( !pSpecialCondition )	return;

	// 诀单捞飘 林扁 盎脚
	WORD wSkillUpdateTime = random( GetBaseInfo()->m_wSkillUpdateTime, GetBaseInfo()->m_wSkillUpdateTime*2 );
	m_pSkillSelectTimer->SetTimer( wSkillUpdateTime );

	switch( pSpecialCondition->wActionType )
	{
	case eNPC_SPECIAL_ACTION_HELPREQUEST:
		{
			// 傍拜措惑捞 绝栏搁 瘤盔夸没 公瓤
			if( !m_pTargetChar )	return;

			AI_MSG_HELP_REQUEST AIHelpMsg;
			AIHelpMsg.dwAttackerKey = m_pTargetChar->GetObjectKey();
			AIHelpMsg.dwTargetKey = GetObjectKey();

			SendAIMessageAroundExceptMe( &AIHelpMsg, sizeof(AIHelpMsg) );
		}
		break;
	case eNPC_SPECIAL_ACTION_TRANSFORMATION:
		{
		}
		break;
	case eNPC_SPECIAL_ACTION_SKILL:
		{
			// 傍拜措惑捞 绝栏搁 胶懦备荤 公瓤
			if( !m_pTargetChar )	return;

			SelectSkill( m_pTargetChar, pSpecialCondition->wActionParam );
			ChangeState( STATE_ID_TRACK );
		}
		break;
	}
}

VOID NPC::StatusResist()
{
	// 老沥矫埃 埃拜栏肺 炼扒阑 眉农茄促.
	if( !m_pSkillSelectTimer->IsExpired( FALSE ) )		return;

	RESISTANCE_CONDITION *pResistanceCondition = NULL;

	for( int i = 0; i < 2; ++i )
	{
		pResistanceCondition = &GetBaseInfo()->m_ResistanceCondition[i];

		// 秦寸惑怕俊 吧啡绰瘤 眉农
		if( !m_pStatusManager->FindStatus( (eCHAR_STATE_TYPE)pResistanceCondition->m_wStateCode ) )	continue;

		// 诀单捞飘 林扁 盎脚
		WORD wSkillUpdateTime = random( GetBaseInfo()->m_wSkillUpdateTime, GetBaseInfo()->m_wSkillUpdateTime*2 );
		m_pSkillSelectTimer->SetTimer( wSkillUpdateTime );

		// 犬伏 眉农
		if( !DrawLots( pResistanceCondition->m_byRatio ) )	continue;

		// 惑怕甫 秦力茄促.
		m_pStatusManager->Remove(  (eCHAR_STATE_TYPE)pResistanceCondition->m_wStateCode );
	}
}






































⌨️ 快捷键说明

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