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

📄 aimanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if (connections[TargetID].chrlst.bAlive>=DEAD_ || 
				connections[TargetID].chrlst.GetState() == CON_STONE ||
				connections[TargetID].chrlst.viewtype == VIEWTYPE_OBSERVE_)
			{
				return NULL;
			}
			else
			{
				return &connections[TargetID].chrlst;
			}
		}	//> CSD-030509
		else
		{
			return NULL;
		}
	}
}

inline int CAIManager::FindTarget(CHARLIST* Npc)
{
	Npc->targetid=NPC_IsWhoNearPC(Npc,GetNPCSearchRange(Npc));	// 15
	return Npc->targetid;
}

inline void CAIManager::FindTarget(CHARLIST* Npc,int& Target)
{
	Target=NPC_IsWhoNearPC(Npc,GetNPCSearchRange(Npc));	// 15
}  

inline int CAIManager::GetPhysicalAttackRange(CHARLIST* Npc)
{	//< CSD-021021
	return GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FATTACK_RANGE);	// 拱府傍拜
}	//> CSD-021021

inline int CAIManager::GetMagicAttackRange(CHARLIST* Npc,int MethodField)
{
	int MagicNo=GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,MethodField); // CSD-021021
	if (MagicNo>=201)
	{
		int Row=MagicNo-200;
		int Col=rand()%10;
		Npc->fame_pk=GetMagicBagData(Row,Col);								//锅龋 历厘
		return Magic_Ref[Npc->fame_pk].invalid_TargetIT;				
	}
	else
	{
		return Magic_Ref[MagicNo].invalid_TargetIT;
	}
}

inline int CAIManager::GetSpecialAttackRange(CHARLIST* Npc,int Method)
{
	return 0;
}

inline int CAIManager::CheckAttackMethod(CHARLIST* Npc,int MethodField)
{
	if (GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,MethodField)==0) // CSD-021021
	{
		return GetPhysicalAttackRange(Npc);
	}
	else
	{
		return GetMagicAttackRange(Npc,MethodField);
	}
}

inline int CAIManager::CheckBAttackMethod(CHARLIST* Npc)
{
	if (Npc->fame==0)
	{
		return GetPhysicalAttackRange(Npc);
	}
	else
	{
		return  Magic_Ref[Npc->fame].invalid_TargetIT;
	}
}


inline int CAIManager::GetAttackRange(CHARLIST* Npc)
{
	switch(Npc->fame)													// 傍拜 规过
	{
	case 1 :	return CheckAttackMethod(Npc,FATTACK_METHOD1);
	case 2 :	return CheckAttackMethod(Npc,FATTACK_METHOD2);			// 付过傍拜
	case 3 :	return CheckAttackMethod(Npc,FATTACK_METHOD3);			// 漂荐傍拜	
	default :	return CheckBAttackMethod(Npc);
	}
}

inline int CAIManager::AttackableRange(CHARLIST* Npc)
{
	CHARLIST *ch;
	int tempRange;
	
	ch=GetTarget(Npc->targetid);
	if (!ch) return FALSE;
	if (Npc->fame==4) return TRUE;										// 家券捞搁 饭牢瘤 鞘夸绝澜.
	
	tempRange=(ch->X-Npc->X)*(ch->X-Npc->X) + (ch->Y-Npc->Y)*(ch->Y-Npc->Y);
	if(tempRange<GetAttackRange(Npc)) 
	{
		return TRUE;
	}	
	return FALSE;
}

inline int CAIManager::CheckAndDoAttack(CHARLIST* Npc)
{	//< CSD-030120
	if (AttackableRange(Npc))										// 傍拜 啊瓷 裹困捞搁 
	{
		if (Npc->patterntype >= NPC_PATTERN_BOSS_WANDER) 
		{
			SendBAttack(Npc);											// 傍拜阑 茄促.
		}
		else 
		{
			SendAttack(Npc);											// 傍拜阑 茄促.
		}
		
		ClearMovePattern(Npc);										// 捞悼吝 傍拜俊 秦寸窍搁 抗傈狼 惑怕甫 努府绢 茄促.	
		// 傍拜规过阑 函版窍档废 窃
		if (Npc->patterntype >= NPC_PATTERN_BOSS_WANDER) 
		{
			//SetAI(Npc,NPC_PATTERN_BOSS_ATTACK);
			SetAI(Npc, NPC_PATTERN_BOSS_ACCESS);
		}
		else 
		{ 
			//SetAI(Npc,NPC_PATTERN_ATTACK); // AIAttack栏肺 傈券 茄促.
			SetAI(Npc,NPC_PATTERN_ACCESS); 
		}
		
		SetAIDelayTime(Npc,FSTATUS03_DELAY,FSTATUS03_SUBDELAY);		// AI 掉饭捞 鸥烙阑 沥茄促.	// FSTATUS03 ATTACK
		return TRUE;
	}
	
	return FALSE;
}	//> CSD-030120

inline void CAIManager::SendMagicAttack(CHARLIST* Npc,int Field)
{
	int MagicNo=GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,Field); // CSD-021021
	if (MagicNo>=201)							// 201 : SStart Number of Special Attack 
	{
		g_pBattleManager->SendNpcMagic(Npc->GetServerID(),Npc->fame_pk);				
	}
	else
	{
		g_pBattleManager->SendNpcMagic(Npc->GetServerID(),MagicNo);
	}
}

inline void CAIManager::SendMagicBAttack(CHARLIST* Npc)
{
	g_pBattleManager->SendNpcMagic(Npc->GetServerID(),Npc->fame);
}


inline void CAIManager::SendPhysicalAttack(CHARLIST* Npc)
{
	SendAttackNPCArea(connections,Npc->GetServerID()); 
}

inline void CAIManager::CheckAndSendAttack(CHARLIST* Npc,int MethodField)
{
	if (GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,MethodField)==0) // CSD-021021
	{
		SendPhysicalAttack(Npc);
		if (Npc->patterntype>=NPC_PATTERN_BOSS_WANDER) SelectBAttackMethod(Npc);
		
	}
	else
	{
		SendMagicAttack(Npc,MethodField);
		if (Npc->patterntype>=NPC_PATTERN_BOSS_WANDER) SelectBAttackMethod(Npc);
		else SelectAttackMethod(Npc);				// 茄锅 傍拜阑 沁栏搁... 促弗规过栏肺 官槽促..
		SetAIDelayTime(Npc,1000);				// 抛捞喉拳 累诀 鞘夸..
	}
}

inline void CAIManager::CheckAndSendBAttack(CHARLIST* Npc)
{
	if (Npc->fame==0)
	{
		SendPhysicalAttack(Npc);
		SelectBAttackMethod(Npc);
	}
	else
	{
		SendMagicBAttack(Npc);
		SelectBAttackMethod(Npc);				// 茄锅 傍拜阑 沁栏搁... 促弗规过栏肺 官槽促..
		SetAIDelayTime(Npc,1000);				// 抛捞喉拳 累诀 鞘夸..
	}
}


inline void CAIManager::SendSummon(CHARLIST* Npc,int NpcIndex)			// LTS DRAGON MODIFY
{	//< CSD-030306
	int id	= GetAliveNPCList();
	int x = Npc->MoveSx;
	int y = Npc->MoveSy;
	
	if (id>0)
	{
		if (NPC_AdjustPosition(0,&x,&y))
		{
			g_pBattleManager->SendNpcRecall(Npc->GetServerID(), 95, NpcIndex, x, y);
			MyLog(0, "Summon Call No : %d, Count 1", NpcIndex);
		}
	}
}	//> CSD-030306

inline void CAIManager::SelectSummonNPC(CHARLIST* Npc)		// LTS DRAGON MODIFY
{	//< CSD-021021
	Npc->scan_time=g_curr_time+GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_DELAY);		// 家券茄 付瘤阜 矫埃 扁撅
	int Npc_Index=rand()%6;			// 家券且 NPC急琶
	switch(Npc_Index)
	{
	case 0 : break;			// MISS
	case 1 : SendSummon(Npc,GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_NPC1)); break;
	case 2 : SendSummon(Npc,GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_NPC2)); break;
	case 3 : SendSummon(Npc,GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_NPC3)); break;
	case 4 : SendSummon(Npc,GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_NPC4)); break;
	case 5 : SendSummon(Npc,GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSUMMON_NPC5)); break;
	}
	SelectAttackMethod(Npc);
}	//> CSD-021021

inline void CAIManager::SendAttack(CHARLIST* Npc)	
{
	switch(Npc->fame)										//傍拜 规过俊 蝶扼
	{
	case 1 :	CheckAndSendAttack(Npc,FATTACK_METHOD1); break;
	case 2 :	CheckAndSendAttack(Npc,FATTACK_METHOD2); break;
	case 3 :	CheckAndSendAttack(Npc,FATTACK_METHOD3); break;
	case 4 :    SelectSummonNPC(Npc); break;
	}
}

inline void CAIManager::SendNPCAction(CHARLIST* Npc,int Action)			// LTS DRAGON MODIFY
{
	t_packet packet;
	packet.h.header.type=CMD_AI_NPC_ACTION;
	packet.u.LocalWar.AINPCAction.ID=Npc->GetServerID();
	packet.u.LocalWar.AINPCAction.Action=Action;
	packet.h.header.size=sizeof(t_AINPCAction);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
}

inline void CAIManager::SendBossAction(CHARLIST* Npc,int AttackMethod)
{
	switch(AttackMethod)
	{
	case 102 : SendNPCAction(Npc,4);	break;
	case 105 : SendNPCAction(Npc,4);	break;
	case 106 : SendNPCAction(Npc,8);	break;
	}
}

inline void CAIManager::SendBossAction(CHARLIST* Npc)				// LTS DRAGON ACTION
{
	if (Npc->IsCasting(g_curr_time))
	{
		switch(Npc->fame)
		{
		case 102 : SendNPCAction(Npc,4);	break;
		case 105 : SendNPCAction(Npc,4);	break;
		case 106 : SendNPCAction(Npc,8);	break;
		}
	}
}

inline void CAIManager::SendBAttack(CHARLIST* Npc)				// LTS DRAGON MODIFY
{
	SendBossAction(Npc);
	CheckAndSendBAttack(Npc);
}


inline void CAIManager::SetRunStatus(CHARLIST* Npc)
{	//< CSD-021021
	if (Npc->GetNature()==NAT_SPEED_UP) return;
	if (rand()%100<GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRUN_PERCENT))
	{ 
		Npc->SetNpcRun(GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRUN_DELAY)+g_curr_time,
			GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRUN_SPEED));
	}
}	//> CSD-021021

inline void CAIManager::SetRecoveryStatus(CHARLIST* Npc)
{	//< CSD-021021
	if (Npc->GetNature()==NAT_LIFE_UP) return;
	if (Npc->HpMax==Npc->Hp) return;
	if (rand()%100<GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRECOVERY_PERCENT))
	{
		Npc->SetNpcRecovery(GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRECOVERY_DELAY)+g_curr_time,
			GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FRECOVERY_AMOUNT)*Npc->HpMax/100);
	}
}	//> CSD-021021

inline void CAIManager::CheckStatusUp(CHARLIST* Npc)
{	//< CSD-021021
	if (Npc->GetNature()==NAT_STATUS_UP) return;
	int LifePercent=Npc->Hp/Npc->HpMax*100;
	if (LifePercent<GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP_LIFE_PERCENT))		
	{
		if (rand()%100>GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP_PERCENT))
		{
			Npc->SetNpcStatusUp(GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP_DELAY)+g_curr_time,
				GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP1),
				GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP2),
				GetNpcAIData(NPC_Gen_Ref[Npc->npc_index].nAINo,FSTATUSUP3));
		}
	}
}	//> CSD-021021

inline void CAIManager::ProcessAIWander(CHARLIST* Npc)				// LTS DRAGON MODIFY
{
	ClearAttackMethod(Npc);											// 傍拜 规过阑 檬扁拳 茄促.
	
	SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);			// 促澜 AI掉饭捞 鸥烙阑 沥茄促.		// FSTATUS01 WANDER
	
	if (FindTarget(Npc)!=-1)										// 辟贸俊 鸥百捞 乐促.
	{
		SetAI(Npc,NPC_PATTERN_ACCESS);								// 促澜 AI甫 荐青茄促.	
		SetTarget(Npc,Npc->targetid);								// 鸥百阑 瘤沥茄促.	
		SetAIDelayTime(Npc,FSTATUS02_DELAY,FSTATUS02_SUBDELAY);		// AI 掉饭捞 鸥烙阑 沥茄促.	// FSTATUS02 ACCESS
	}
	else
	{
		RandomMove(Npc);
	}
}

inline void CAIManager::ProcessAIAccess(CHARLIST* Npc)
{
	SetAIDelayTime(Npc,FSTATUS02_DELAY,FSTATUS02_SUBDELAY);				// AI 掉饭捞 鸥烙阑 沥茄促.	// FSTATUS02 ACCESS
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		SelectAttackMethod(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
	{
		if (FindTarget(Npc)==-1)										//林困俊 利捞 绝栏搁 
		{
			SetAIDefault(Npc);											//硅雀 惑怕肺 茄促.
			ClearTarget(Npc);											// 鸥百 檬扁拳
			SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);		
		}
		else
		{
			TargetMove(Npc);											// 格钎 辟贸肺 捞悼茄促.
		}
	}
}

inline void CAIManager::ProcessAIAttack(CHARLIST* Npc)						// LTS DRAGON MODIFY
{
	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_ACCESS);
				}
			}
			else 
			{
				SetAIDefault(Npc);
				ClearTarget(Npc);										// 鸥百 檬扁拳
				SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);
			}
		}
	}
	else
	{
		if (FindTarget(Npc)==-1)
		{
			SetAIDefault(Npc);											// 硅雀 惑怕肺 茄促.
			ClearTarget(Npc);											// 鸥百 檬扁拳
			SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);
		}
		else
		{
			SetAI(Npc,NPC_PATTERN_ACCESS);								// 利捞 乐栏搁 
		}
	}
}

inline void CAIManager::ProcessAIAttacked(CHARLIST* Npc)			// LTS DRAGON MODIFY
{
	SetAIDelayTime(Npc,FSTATUS04_DELAY,FSTATUS04_SUBDELAY);		// AI掉饭捞 鸥烙阑 拌魂		// FSTATUS04 ATTACKED
	CHARLIST* Target=GetTarget(Npc->targetid);
	if (Target!=NULL)
	{
		if (!CheckAndDoAttack(Npc))								// 傍拜 啊瓷 裹困啊 酒聪搁 
		{
			SetAI(Npc,NPC_PATTERN_ACCESS);
			SetRunStatus(Npc);									// 崔府扁 利侩
			CheckStatusUp(Npc);									// 堡气利侩
		}
	}
	else
	{
		SetAIDefault(Npc);										// 硅雀 惑怕肺 茄促.
		ClearTarget(Npc);										// 鸥百 檬扁拳
		SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);														
	}
}

inline void CAIManager::CheckMoveWander(CHARLIST* Npc)
{
	SetAIDelayTime(Npc,FSTATUS01_DELAY,FSTATUS01_SUBDELAY);		// AI掉饭捞 鸥烙阑 拌魂		// Wander客 鞍篮 蔼
	if (FindTarget(Npc)!=-1)									// 辟贸俊 鸥百捞 乐促.
	{	
		if (Npc->EventPoint>=NPC_PATTERN_BOSS_WANDER)
		{
			ClearMovePattern(Npc);									//	抗傈 AI甫 努府绢 
			SetAI(Npc,NPC_PATTERN_BOSS_ACCESS);
		}
		else
		{
			ClearMovePattern(Npc);									//	抗傈 AI甫 努府绢 
			SetAI(Npc,NPC_PATTERN_ACCESS);
		}
		SetTarget(Npc,Npc->targetid);							// 鸥百阑 瘤沥茄促.	
	}
	else
	{
		if (!NPC_IsMoving(Npc))									// NPC啊 框流捞瘤 臼绊 勒促搁
		{	
			SetAI(Npc,Npc->EventPoint);							// 盔贰 硅雀 ID肺 技泼阑 茄促.	
			ClearMovePattern(Npc);						
		}
	}
}

inline void CAIManager::CheckAndModifyTarget(CHARLIST* Npc)
{
	LPCHARLIST Target=&connections[Npc->targetid].chrlst;
	int TargetX,TargetY;
	int TargetMoveX=Npc->tx*TILE_SIZE;
	int TargetMoveY=Npc->ty*TILE_SIZE;
	
	int ChangeRange=(4*32)*(4*32);					// 某腐磐狼 捞悼窍妨绰 谅钎啊 扁粮焊促 3鸥老捞惑 瞒捞抄促搁 菩胶呼靛茄促.
	int ResultRange=(Target->MoveGox-TargetMoveX)*(Target->MoveGox-TargetMoveX)+
		(Target->MoveGoy-TargetMoveY)*(Target->MoveGoy-TargetMoveY);
	

⌨️ 快捷键说明

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