📄 aimanager.cpp
字号:
// 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 + -