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