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

📄 aimanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if (ResultRange>ChangeRange)  //捞悼窍绰 困摹啊 促福促搁 捞悼阑 荐沥茄促.
	{
		if (NPC_NearCh(Npc,Target,&TargetX,&TargetY))
		{
			if (NPC_MakePath(Npc,TargetX,TargetY,rand()%6+2))			// 鸥南栏肺 何磐狼 困摹 罚待
			{
				SendModifyPositionNPC(connections,Npc->GetServerID());		
				SendMoveNPCArea( connections, Npc->GetServerID());
			}
		}
	}
}

inline void CAIManager::CheckMoveAccess(CHARLIST* Npc)
{
	SetAIDelayTime(Npc,FSTATUS05_DELAY,FSTATUS05_SUBDELAY); 	// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS05 ACCESS MOVE
	
	if (!CheckAndDoAttack(Npc))							// 傍拜 啊瓷 裹困捞搁 
	{
		if (!NPC_IsMoving(Npc))							// NPC啊 框流捞瘤 臼绊 勒促搁
		{	
			SetAI(Npc,Npc->EventPoint);					// 盔贰 硅雀 ID肺 技泼阑 茄促.	
			ClearMovePattern(Npc);						
		}
		else											// 框流捞绊 乐促搁
		{
			switch (NPC_Gen_Ref[Npc->npc_index].nAttr)
			{	//< CSD-031027
			case AT_PIERCING:
			case AT_ANTIMAGIC:
			case AT_BOSS:
			case AT_SEMIBOSS:
				{
					CheckAndModifyTarget(Npc);
					break;
				}
			}	//> CSD-031027
			
		}
	}
	else
	{
	}
}


inline void CAIManager::ProcessAIMoving(CHARLIST* Npc)			// LTS DRAGON MODIFY	
{
	if (!Npc->EventPoint) return;							// NPC_MOVING栏肺 埃 加己 Wander, Access, Attack
	switch (Npc->EventPoint)
	{
	case NPC_PATTERN_WANDER		 :	CheckMoveWander(Npc);	break;
	case NPC_PATTERN_ACCESS		 :	CheckMoveAccess(Npc);	break;
	}
}

inline int** CAIManager::GetBossStatusData()
{
	return m_pBossStatusData;
}

inline int* CAIManager::GetBossStatusData(int TypeNo)
{
	return m_pBossStatusData[TypeNo];
}

inline int CAIManager::GetBossStatusData(int TypeNo,int Field)
{
	return m_pBossStatusData[TypeNo][Field];
}

inline int CAIManager::inHPRange(CHARLIST* Npc,int sField,int eField,int Percent)
{
	if (GetBossStatusData(Npc->CurrentPhase,sField)>Percent&&GetBossStatusData(Npc->CurrentPhase,eField)<=Percent) return TRUE;
	return FALSE;
}

inline int CAIManager::CheckHPGrade(CHARLIST* Npc)		// LTS DRAGON MODIFY
{
	int HPPercent=(Npc->Hp*100)/Npc->HpMax;
	
	if (HPPercent==100) return 1;
	if (inHPRange(Npc,FBHP_GRADE1,FBHP_GRADE2,HPPercent)) return 1;
	if (inHPRange(Npc,FBHP_GRADE2,FBHP_GRADE3,HPPercent)) return 2;
	if (inHPRange(Npc,FBHP_GRADE3,FBHP_GRADE4,HPPercent)) return 3;
	if (inHPRange(Npc,FBHP_GRADE4,FBHP_GRADE5,HPPercent)) return 4;
	if (inHPRange(Npc,FBHP_GRADE5,FBHP_GRADE6,HPPercent)) return 5;
	if (GetBossStatusData(Npc->CurrentPhase,FBHP_GRADE6)>HPPercent&&0<=HPPercent) return 6;
	
	return 0;
}

inline void CAIManager::SetActionFunc(CHARLIST* Npc,int HPGrade,int* Action)
{
	switch(HPGrade)
	{
	case 0 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION0_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION0_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION0_METHOD3);					break;
	case 1 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION1_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION1_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION1_METHOD3);					break;
	case 2 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION2_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION2_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION2_METHOD3);					break;
	case 3 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION3_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION3_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION3_METHOD3);					break;
	case 4 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION4_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION4_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION4_METHOD3);					break;
	case 5 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION5_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION5_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION5_METHOD3);					break;
	case 6 :
		Action[0]=GetBossStatusData(Npc->CurrentPhase,FBACTION6_METHOD1);
		Action[1]=GetBossStatusData(Npc->CurrentPhase,FBACTION6_METHOD2);
		Action[2]=GetBossStatusData(Npc->CurrentPhase,FBACTION6_METHOD3);					break;
	}
}


inline void CAIManager::CallActionFunc(CHARLIST* Npc,int* Action)
{
	if (Action[0]>0) (*ActionFunc[m_pActionBag[Action[0]][0]-1])(Npc,m_pActionBag[Action[0]][1],m_pActionBag[Action[0]][2]);
	if (Action[1]>0) (*ActionFunc[m_pActionBag[Action[1]][0]-1])(Npc,m_pActionBag[Action[1]][1],m_pActionBag[Action[1]][2]);
	if (Action[2]>0) (*ActionFunc[m_pActionBag[Action[2]][0]-1])(Npc,m_pActionBag[Action[2]][1],m_pActionBag[Action[2]][2]);
}

inline void CAIManager::OnHPAction(CHARLIST* Npc,int HPGrade)		// LTS DRAGON MODIFY
{
	if (HPGrade!=0&&Npc->EventLocalWarJoin) return;								// 捞固 HP弊饭捞靛 惑怕甫 角青茄仇捞促.
	
	int Action[3];
	
	SetActionFunc(Npc,HPGrade,Action);
	
	t_packet  packet;
	packet.h.header.type=CMD_AI_ACTION_TEST;
	if (Action[0]>0) packet.u.LocalWar.ActionTest.Action[0]=m_pActionBag[Action[0]][0];
	else packet.u.LocalWar.ActionTest.Action[0]=0;
	if (Action[1]>0) packet.u.LocalWar.ActionTest.Action[1]=m_pActionBag[Action[1]][0];
	else packet.u.LocalWar.ActionTest.Action[1]=0;
	if (Action[2]>0) packet.u.LocalWar.ActionTest.Action[2]=m_pActionBag[Action[2]][0];
	else packet.u.LocalWar.ActionTest.Action[2]=0;
	packet.h.header.size=sizeof(t_ActionTest);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
	
	MyLog(0,"NPC : %d, HPAction : %d,%d,%d",Npc->SprNo,Action[0],Action[1],Action[2]);
	
	CallActionFunc(Npc,Action);
	
	Npc->EventLocalWarJoin=TRUE;	// 捞固 贸府沁促绊 扁废 
}

inline void CAIManager::OnCloseHPAction(CHARLIST* Npc)
{
	int Action[3];
	
	SetActionFunc(Npc,Npc->mantle,Action);
	
	if (Action[0]==6||Action[0]==1)	// 咀记吝 雀乔捞芭唱 措扁捞搁 
	{
		SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
	}
	if (Action[1]==6||Action[1]==1)	// 咀记吝 雀乔捞芭唱 措扁捞搁 
	{
		SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
	}
	if (Action[2]==6||Action[2]==1)	// 咀记吝 雀乔捞芭唱 措扁捞搁 
	{
		SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
	}
	
	Npc->EventLocalWarJoin=FALSE;
}

inline void CAIManager::ProcessAIBWander(CHARLIST* Npc)			// LTS DRAGON MODIFY
{
	ClearAttackMethod(Npc);											// 傍拜 规过阑 檬扁拳 茄促.
	
	SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);			// 促澜 AI掉饭捞 鸥烙阑 沥茄促.		// FSTATUS01 WANDER
	
	if (FindTarget(Npc)!=-1)										// 辟贸俊 鸥百捞 乐促.
	{
		ClearMovePattern(Npc);										//	抗傈 AI甫 努府绢 
		SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
		SetTarget(Npc,Npc->targetid);								// 鸥百阑 瘤沥茄促.	
		OnHPAction(Npc,0);												// 碍力肺 0锅 咀记阑 荐青
	}
}

inline void CAIManager::ProcessAIBAccess(CHARLIST* Npc)					// LTS DRAGON MODIFY
{
	SetAIDelayTime(Npc,FSTATUS02_DELAY,FSTATUS02_SUBDELAY);				// AI 掉饭捞 鸥烙阑 沥茄促.	// FSTATUS02 ACCESS
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		SelectBAttackMethod(Npc);										// 傍拜 规过阑 急琶
		if (!CheckAndDoAttack(Npc))
		{
			int Target_ID;												// 林困俊 歹 啊鳖款仇捞 乐绰瘤 八荤
			FindTarget(Npc,Target_ID);
			if (Target_ID!=-1)											// 歹 啊鳖款 利捞 绝促 
			{
				if (!CheckAndDoAttack(Npc))
				{
					SetTarget(Npc,Target_ID);
					TargetMove(Npc);									// 格钎 辟贸肺 捞悼茄促.
				}
			}
			else
			{
				SetAIBDefault(Npc);											//硅雀 惑怕肺 茄促.
				ClearTarget(Npc);											// 鸥百 檬扁拳
				SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);		
			}
		}
	}
	else
	{
		if (FindTarget(Npc)==-1)										//林困俊 利捞 绝栏搁 
		{
			SetAIBDefault(Npc);											//硅雀 惑怕肺 茄促.
			ClearTarget(Npc);											// 鸥百 檬扁拳
			SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);		
		}
		else
		{
			TargetMove(Npc);											// 格钎 辟贸肺 捞悼茄促.
		}
	}
}

inline void CAIManager::ProcessAIBAttack(CHARLIST* Npc)
{
	SetAIDelayTime(Npc,FSTATUS03_DELAY,FSTATUS03_SUBDELAY);				// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS03 ATTACK
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		if (!CheckAndDoAttack(Npc))										// 傍拜 啊瓷 裹困捞搁 
		{
			if (FindTarget(Npc)!=-1)
			{
				if (!CheckAndDoAttack(Npc))
				{
					SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
				}
			}
			else 
			{
				SetAIBDefault(Npc);
				ClearTarget(Npc);										// 鸥百 檬扁拳
				SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);
			}
		}
	}
	else
	{
		if (FindTarget(Npc)==-1)
		{
			SetAIBDefault(Npc);											// 硅雀 惑怕肺 茄促.
			ClearTarget(Npc);											// 鸥百 檬扁拳
			SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);
		}
		else
		{
			SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);								// 利捞 乐栏搁 
		}
	}
}

void CAIManager::ProcessAIBAttacked(CHARLIST* Npc)
{
	// 傍拜寸窍搁 购啊 秦霖促.
}

inline void CAIManager::ProcessAIBMoving(CHARLIST* Npc)
{
	if (!Npc->EventPoint) return;							// NPC_MOVING栏肺 埃 加己 Wander, Access, Attack
	switch (Npc->EventPoint)
	{
	case NPC_PATTERN_BOSS_WANDER :	CheckMoveWander(Npc);	break;
	case NPC_PATTERN_BOSS_ACCESS :	CheckMoveAccess(Npc);	break;
	}
}

inline void CAIManager::ProcessAIBBackDraw(CHARLIST* Npc)
{
	SetAIDelayTime(Npc,FSTATUS06_DELAY,FSTATUS06_SUBDELAY);				// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS03 ATTACK
	
	if (NPC_IsMoving(Npc)) return;
	
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		if (InDistance(Npc,Target,32*10))
		{
			int ex,ey;
			if (NPC_NearBackCh(Npc,Target,&ex,&ey,10))	// 第肺 档噶
			{
				NPC_MakePath(Npc,ex,ey,rand()%10+5);
			}
			else
			{
				FindTarget(Npc);
			}
		}
	}
	else
	{
		FindTarget(Npc);
	}
}

inline void CAIManager::ProcessAIBAvoid(CHARLIST* Npc)						// 捞惑怕绰 HP咀记俊辑 贸府茄促.	// 呕免篮 OnHPActionClose
{
	SetAIDelayTime(Npc,FSTATUS03_DELAY,FSTATUS03_SUBDELAY);//烙矫肺3				// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS03 ATTACK
	// 割鸥老 第肺 档噶饶 罚待摹肺 康开俊 乐促搁 傍拜茄促.
	if (NPC_IsMoving(Npc)) return;
	
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		if (InDistance(Npc,Target,32*5))	// 5鸥老 救俊 利捞乐促搁
		{
			int ex,ey;
			if (NPC_NearBackCh(Npc,Target,&ex,&ey,5))	// 第肺 档噶
			{
				NPC_MakePath(Npc,ex,ey,rand()%10+5);
				SelectBAttackMethod(Npc);
			}
		}
		else		// 5鸥老 救俊 利捞 绝促搁	// Search饭牢瘤甫 第柳促
		{
			if (FindTarget(Npc)!=-1)	//利捞乐促搁
			{
				CheckAndDoAttack(Npc);	// 绢琶饭牢瘤俊 乐促搁
			}
		}
	}
	else
	{
		FindTarget(Npc);	
	}
}

inline void CAIManager::ProcessAIBWait(CHARLIST* Npc)						// 捞惑怕绰 HP咀记俊辑 贸府秦 霖促.	// 呕免篮 OnHPActionClose
{
	SetAIDelayTime(Npc,FSTATUS08_DELAY,FSTATUS08_SUBDELAY);				// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS03 ATTACK
	//捞惑怕俊辑绰 酒公巴档 窍瘤臼绰促.									// Attacked唱 咀记 惑怕啊 官差搁 贸府等促
}

inline void CAIManager::CheckHPStatus(CHARLIST* Npc) // LTS DRAGON MODIFY
{
	int HPGrade=CheckHPGrade(Npc);
	if (HPGrade!=Npc->mantle)				// OLD HP STATUS客 厚背
	{	// 货肺款 HP惑怕俊 甸绢咳
		if (DRAGON_HEART_INDEX_NO==Npc->npc_index)	//靛贰帮窍飘捞搁 HP啊 眉牢瘤瞪锭.. 贸府秦霖促.
		{
			if (CheckDragonPtr(Npc))
			{
				m_pDragon->Hp=Npc->Hp;
			}
		}
		OnCloseHPAction(Npc);
		Npc->mantle=HPGrade;
		OnHPAction(Npc,HPGrade);
	}
}

inline CHARLIST* CAIManager::GetNearNPC(CHARLIST* Npc,int IndexNo,int Range) // LTS DRAGON MODIFY
{
	for (int i=NPC_LIST_START;i<MAX_NPC_LIST;i++)
	{
		if (IndexNo==NPCList[i].npc_index)
		{
			int tempRange=(Npc->X-NPCList[i].X)*(Npc->X-NPCList[i].X) + (Npc->Y-NPCList[i].Y)*(Npc->Y-NPCList[i].Y);
			tempRange=sqrt(tempRange);
			if (tempRange<Range)
			{
				return &NPCList[i];
			}
		}
	}
	return NULL;
}

inline int CAIManager::CheckDragonPtr(CHARLIST* Npc) // LTS DRAGON MODIFY, LTS DRAGONLORD
{
	if (!m_pDragon)
	{
		m_pDragon=GetNearNPC(Npc,DRAGON_INDEX_NO,3000);
		if (!m_pDragon)
		{
			m_pDragon=GetNearNPC(Npc,DRAGON_LORD_INDEX_NO,3000);
			if (!m_pDragon)
			{
				return FALSE;
			}
		}
	}
	return TRUE;
}

CHARLIST* CAIManager::GetDragonPtr(CHARLIST* Npc) // LTS DRAGON MODIFY
{
	if (CheckDragonPtr(Npc))
	{
		return m_pDragon;
	}
	return NULL;
}

inline void CAIManager::CheckDragonHeartDeath(CHARLIST* Defender) // LTS DRAGON MODIFY
{
	if (DRAGON_HEART_INDEX_NO!=Defender->npc_index) return;
	
	if (CheckDragonPtr(Defender))
	{
		KillMonster(m_pDragon->GetServerID());
	}
	
}

void CAIManager::CheckDeath(CHARLIST* Defender) // LTS DRAGON MODIFY
{
	if (!Defender->IsNpc()) return;
	
	CheckSummonDeath(Defender);
	CheckDragonHeartDeath(Defender);
}


void CAIManager::ProcessNPCAI(CHARLIST* Npc)
{
	if (!isProcess(Npc))
	{
		return;
	}

	switch (Npc->patterntype)
	{
	case NPC_PATTERN_WANDER			: ProcessAIWander(Npc);		break;
	case NPC_PATTERN_ACCESS			: ProcessAIAccess(Npc);		break;
	case NPC_PATTERN_ATTACK			: ProcessAIAttack(Npc);		break;
	case NPC_PATTERN_ATTACKED		: ProcessAIAttacked(Npc);	break;
	case NPC_PATTERN_MOVING			: ProcessAIMoving(Npc);		break;
		
	case NPC_PATTERN_BOSS_WANDER	: ProcessAIBWander(Npc);	break;
	case NPC_PATTERN_BOSS_ACCESS	: ProcessAIBAccess(Npc);	break;
	case NPC_PATTERN_BOSS_ATTACK	: ProcessAIBAttack(Npc);	break;
	case NPC_PATTERN_BOSS_MOVING	: ProcessAIBMoving(Npc);	break;
	case NPC_PATTERN_BOSS_BACKDRAW	: ProcessAIBBackDraw(Npc);	break;
	case NPC_PATTERN_BOSS_WAIT		: ProcessAIBWait(Npc);		break;
	case NPC_PATTERN_BOSS_AVOID		: ProcessAIBAvoid(Npc);		break;
	}
	
	if (Npc->patterntype>=NPC_PATTERN_BOSS_WANDER)	// AI甫 场辰促澜俊 惑怕函版阑 茄促.
	{
		CheckHPStatus(Npc);
	}
}

⌨️ 快捷键说明

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