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

📄 aimanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// AIManager.cpp: implementation of the CAIManager class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "AIManager.h"

#include "AIDefine.h"
#include "Npc_Pattern.h"
#include "BattleManager.h"

///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////

#define MAX_ACTION_FUNC		12

extern NPC_Generation		NPC_Gen_Ref[Num_Of_NPC_Generation];
extern HENV					hEnv;
extern HDBC					hDBC;
extern MAGICTABLE			Magic_Ref[Num_Of_Magic]; 
CAIManager*					g_NPC_AI;

extern void KillMonster(WORD wNumber);		// LTS DRAGON MODIFY

// 030919 HK YGI
char NetworkDir[MAX_PATH];
char MapServerConfigFileName[MAX_PATH];
void LoadAIConfig()							// LTS DRAGON MODIFY
{
	if (GetPrivateProfileString("Network","path","",NetworkDir,MAX_PATH,MAP_SERVER_INI_)<=0)
	{
		MyLog(0,"Error!! Check...  Mapserver.ini Path Setting..!!");
		return;
	}
	sprintf(MapServerConfigFileName,"%s/data/MapServerConfig.ini",NetworkDir);
	MyLog( 0, "MapServerConfigFileName is %s", MapServerConfigFileName ); // 031110 YGI
}
////////////////////////////////////////////

int InitAIData()
{
	int Check_OK=TRUE;
	
	if (!g_pAIManager->Load_AI_Data()) Check_OK=FALSE;
	if (!g_pAIManager->LoadBossData()) Check_OK=FALSE;
	if (!g_pAIManager->LoadAttackBag()) Check_OK=FALSE;
	if (!g_pAIManager->LoadActionBag()) Check_OK=FALSE;

	return Check_OK;
}

void ClearAIData()
{
	SAFE_DELETE(g_NPC_AI);
}

void ClearAI()
{
	SAFE_DELETE(g_NPC_AI);
}

void ReloadAIData()	// LTS AI2
{	//< CSD-030417
	if (g_pAIManager->Load_AI_Data())
	{
		MyLog(0,"NPC AI Data Load Complete!!");
	}
	else
	{
		MyLog(0,"FAILURE!! NPC AI Data Load!!");
	}
}	//> CSD-030417

void 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);
}

CHARLIST* GetNearNPC(CHARLIST* Npc,int NPCIndex,int Range)
{
	for (int i=NPC_LIST_START;i<MAX_NPC_LIST;i++)
	{
		if (NPCIndex==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;
}


void ACAvoid(CHARLIST* Npc,int Param1,int Param2)
{	//< CSD-030417
	// AI掉饭捞鸥烙捞 绝栏骨肺 溜矫 角青等促.
	g_pAIManager->SetAI(Npc,NPC_PATTERN_BOSS_AVOID);
}	//> CSD-030417

extern void SendCharacterCondition(CHARLIST* lpChar, int change_HP);
void ACHPRecovery(CHARLIST* Npc,int Param1,int Param2)
{
	if (Npc->HorseNo>3) return;
	int HPAmount=Npc->HpMax*Param1/100;
	Npc->Hp=HPAmount;
	SendCharacterCondition(Npc,Npc->Hp);			// 
	Npc->HorseNo++;
}

void ACStatusUp(CHARLIST* Npc,int Param1,int Param2)
{
	Npc->SetNpcStatusUp(100, 30,30,30);					//犬牢 鞘夸
}

void MakeFogLocation(CHARLIST* Npc,int RangeX,int RangeY,POINTS* Location)		// LTS NEW AI	// Range Unit : Dot
{
	int BaseX=Npc->X-(RangeX>>1);
	int BaseY=Npc->Y-(RangeY>>1);
	
	for (int i=0;i<FOG_MAX;i++)
	{
		Location[i].x=BaseX+rand()%RangeX;
		Location[i].y=BaseY+rand()%RangeY;
	}
}

void MakeDragonFogLocation(CHARLIST* Npc,int RangeX,int RangeY,POINTS* Location)	// LTS DRAGON MODIFY
{
	int BaseX=Npc->X-(RangeX-300);
	int BaseY=Npc->Y-300;
	
	for (int i=0;i<FOG_MAX;i++)
	{
		Location[i].x=BaseX+rand()%RangeX;
		Location[i].y=BaseY+rand()%RangeY;
	}
}


void ACFog(CHARLIST* Npc,int Param1,int Param2)
{
	t_packet packet;
	
	packet.h.header.type=CMD_AI_FOG;
	packet.u.LocalWar.AIFog.Type=Param1;
	packet.u.LocalWar.AIFog.Delay=Param2;
	MakeFogLocation(Npc,800,600,packet.u.LocalWar.AIFog.Location);	// 茄拳搁 
	packet.h.header.size=sizeof(t_AIFog);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
}

void ACDragonFog(CHARLIST* Npc,int Param1,int Param2)				// LTS DRAGON MODIFY
{
	t_packet packet;
	
	packet.h.header.type=CMD_AI_FOG;
	packet.u.LocalWar.AIFog.Type=Param1;
	packet.u.LocalWar.AIFog.Delay=Param2;
	MakeDragonFogLocation(Npc,1024,768,packet.u.LocalWar.AIFog.Location);	// 茄拳搁 
	packet.h.header.size=sizeof(t_AIFog);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
}

void ACWait(CHARLIST* Npc,int Param1,int Param2)
{	//< CSD-030417
	// AI掉饭捞鸥烙捞 绝栏骨肺 溜矫 角青等促.
	g_pAIManager->SetAI(Npc,NPC_PATTERN_BOSS_WAIT);
}	//> CSD-030417

void ACSound(CHARLIST* Npc,int Param1,int Param2)
{
	t_packet packet;
	
	packet.h.header.type=CMD_AI_SOUND;
	packet.u.LocalWar.CommonDataDw.Data=Param1;
	packet.h.header.size=sizeof(t_CommonDataDw);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
}

void ACSummon(CHARLIST* Npc,int Param1,int Param2) // LTS NPC_BUG
{	//< CSD-030417
	if (Param2 < 0) 
	{
		return;
	}
	
	MyLog(0, "Summon Call No : %d, Count %d", Param1, Param2);
	
	int nX = Npc->X - (6*TILE_SIZE);
	int nY = Npc->Y + (6*TILE_SIZE);

	switch (Npc->npc_index)
	{
	case DRAGON_INDEX_NO:
	case DRAGON_HEART_INDEX_NO:
		{
			for (int i = 0; i < Param2; ++i)
			{
				g_pBattleManager->SendNpcRecall(Npc->GetServerID(), 95, Param1, nX, nY);
			}

			break;
		}
	default:
		{
			for (int i = 0; i < Param2; ++i)
			{
				if (NPC_NearCh(Npc, Npc, &nX, &nY))
				{
					g_pBattleManager->SendNpcRecall(Npc->GetServerID(), 95, Param1, nX*TILE_SIZE, nY*TILE_SIZE);
				}
			}

			break;
		}
	}
}	//> CSD-030417

void ACEarthQuake(CHARLIST* Npc,int Param1,int Param2)		// LTS DRAGON MODIFY
{
	t_packet packet;
	packet.h.header.type=CMD_AI_EARTHQUAKE;
	packet.u.LocalWar.CommonDataC.Data=Param1;
	packet.h.header.size=sizeof(t_CommonDataC);
	
	CastNPC2Other(Npc->GetServerID(),&packet);
}

void ACAttack(CHARLIST* Npc,int Param1,int Param2)
{	//< CSD-030417
	if (DRAGON_INDEX_NO == Npc->npc_index)
	{
		g_pAIManager->SendBossAction(Npc, Param1);
	}

	g_pBattleManager->SendNpcMagic(Npc->GetServerID(), Param1, Npc->X, Npc->Y, true);
}	//> CSD-030417

void ACSummon2(CHARLIST* Npc,int Param1,int Param2)			// LTS DRAGON BUG
{	//< CSD-030417
	if (Param2 < 0)
	{
		return;
	}
	
	MyLog(0, "Summon Call No : %d, Count %d", Param1, Param2);

	int nX = Npc->X - (6*TILE_SIZE);
	int nY = Npc->Y + (6*TILE_SIZE);
	
	switch (Npc->npc_index)
	{
	case DRAGON_INDEX_NO:
	case DRAGON_HEART_INDEX_NO:
		{
			for (int i=0; i < Param2; ++i)
			{
				g_pBattleManager->SendNpcRecall(Npc->GetServerID(), 95, Param1, nX, nY);
			}

			break;
		}
	default:
		{
			for (int i = 0; i < Param2; ++i)
			{
				if (NPC_NearCh(Npc,Npc,&nX,&nY))
				{
					g_pBattleManager->SendNpcRecall(Npc->GetServerID(), 95, Param1, nX*TILE_SIZE, nY*TILE_SIZE);
				}
			}

			break;
		}
	}
}	//> CSD-030417

void ACDragonTelePort(CHARLIST* Npc,int Param1,int Param2)		// LTS DRAGON MODIFY
{	//< CSD-030417
	if (DRAGON_HEART_INDEX_NO != Npc->npc_index)
	{
		return;
	}
	
	POINTS	WithNPCPoint;
	if (Npc->MoveSx==444)
	{
		Npc->X=489*TILE_SIZE;
		Npc->Y=75*TILE_SIZE;
		WithNPCPoint.x=492*TILE_SIZE;
		WithNPCPoint.y=73*TILE_SIZE;
		MyLog(0,"TelePort Call Old : %d:%d, %d:%d",Npc->MoveSx,Npc->MoveSy,Npc->X/TILE_SIZE,Npc->Y/TILE_SIZE);
	}
	else
	{
		Npc->X=444*TILE_SIZE;
		Npc->Y=30*TILE_SIZE;
		WithNPCPoint.x=446*TILE_SIZE;
		WithNPCPoint.y=27*TILE_SIZE;
		MyLog(0,"TelePort Call Old : %d:%d, %d:%d",Npc->MoveSx,Npc->MoveSy,Npc->X/TILE_SIZE,Npc->Y/TILE_SIZE);
	}
	
	CHARLIST* WithNPC = g_pAIManager->GetDragonPtr(Npc);
	
	if (WithNPC!=NULL) 
	{
		SendNPCAction(WithNPC,9);
		g_pBattleManager->SendNpcMagic(WithNPC->GetServerID(),105,Npc->X,Npc->Y,true);
		g_pBattleManager->SendNpcTeleport(Npc->GetServerID(), Npc->X, Npc->Y);
		g_pBattleManager->SendNpcTeleport(WithNPC->GetServerID(), WithNPCPoint.x, WithNPCPoint.y);	
	}
	else
	{
		g_pBattleManager->SendNpcTeleport(Npc->GetServerID(), Npc->X, Npc->Y);		// 父距阑 困茄 内靛 
	}
}	//> CSD-030417

void (*ActionFunc[MAX_ACTION_FUNC])(CHARLIST* Npc,int Param1,int Param2) =
{
	ACAvoid,
	ACHPRecovery,
	ACStatusUp,
	ACFog,
	ACWait,
	ACSound,
	ACSummon,
	ACEarthQuake,
	ACAttack,
	ACSummon2,
	ACDragonTelePort,
	ACDragonFog
};

///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////

CAIManager::CAIManager()
{
	m_pNpc_AI_Data=NULL;
	m_iAI_DataCount=0;
	m_pMagicBag=NULL;
	m_iMagicBagCount=0;
	m_pBossStatusData=NULL;
	m_iBossStatusCount=0;
	m_pAttackBag=NULL;
	m_iAttackBagCount=0;
	m_pActionBag=NULL;
	m_iActionBagCount=0;
	m_pDragon=NULL;
}

CAIManager::~CAIManager()
{
	Clear_AI_Data();
	ClearBossData();
}

void CAIManager::Clear_AI_Data()
{
	if (m_pNpc_AI_Data)
	{
		for (int i=0;i<m_iAI_DataCount;i++)
		{
			
			if (m_pNpc_AI_Data[i])
			{
				SAFE_DELETE_ARRAY(m_pNpc_AI_Data[i]);
			}
		}
		SAFE_DELETE_ARRAY(m_pNpc_AI_Data);
	}
	ClearMagicBag();
}	

void CAIManager::ClearBossData()
{
	if (m_pBossStatusData)
	{
		for (int i=0;i<m_iBossStatusCount;i++)
		{
			
			if (m_pBossStatusData[i])
			{
				SAFE_DELETE_ARRAY(m_pBossStatusData[i]);
			}
		}
		SAFE_DELETE_ARRAY(m_pBossStatusData);
	}
	
	ClearAttackBag();
	ClearActionBag();
}	

void CAIManager::ClearMagicBag()
{
	if (m_pMagicBag)
	{
		for (int i=0;i<m_iMagicBagCount;i++)
		{
			SAFE_DELETE_ARRAY(m_pMagicBag[i]);
		}
		SAFE_DELETE_ARRAY(m_pMagicBag);
	}
}


void CAIManager::ClearAttackBag()
{
	if (m_pAttackBag)
	{
		for (int i=0;i<m_iAttackBagCount;i++)
		{
			SAFE_DELETE_ARRAY(m_pAttackBag[i]);
		}
		SAFE_DELETE_ARRAY(m_pAttackBag);
	}
}

void CAIManager::ClearActionBag()
{
	if (m_pActionBag)
	{
		for (int i=0;i<m_iActionBagCount;i++)
		{
			SAFE_DELETE_ARRAY(m_pActionBag[i]);
		}
		SAFE_DELETE_ARRAY(m_pActionBag);
	}
}

int CAIManager::Load_AI_Data()
{
	HSTMT	hStmt=NULL;
	RETCODE	ret;
	SWORD	nClos;
	char	query_stmt[80]={0,};
	SDWORD	cbValue;
	int		RowCount;
	
	if (m_pNpc_AI_Data)								// 捞固 单捞磐啊 乐促搁 橇府秦霖促..
	{
		Clear_AI_Data();
	}
	
	SQLAllocStmt(hDBC,&hStmt);
	
	wsprintf(query_stmt,"select count(AI_Type) as FieldCount from NPC_AI_CONTROL");   
	
	ret=SQLExecDirect(hStmt,(UCHAR*)query_stmt,SQL_NTS);
	
	if (ret!=SQL_SUCCESS_WITH_INFO && ret !=SQL_SUCCESS)
	{
		MyLog(0,"Load_AI_Data(), NPC_AI_CONTROL Table Query Error!!");
		SQLFreeStmt(hStmt,SQL_DROP);
		return FALSE;
	}

⌨️ 快捷键说明

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