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