📄 npc.cpp
字号:
break;
case 4: // 老馆, 概流
m_bCanNormalAT = TRUE;
m_bCanMagicAT = FALSE;
m_bCanSPAT = TRUE;
break;
case 5: // 漂荐父
m_bCanNormalAT = FALSE;
m_bCanMagicAT = FALSE;
m_bCanSPAT = TRUE;
m_tSPATRange = m_byWildShot;
m_tSPATAI = m_byExcitedRate;
break;
case 6: // 老馆, 概流, 漂荐
m_bCanNormalAT = TRUE;
m_bCanMagicAT = TRUE;
m_bCanSPAT = TRUE;
m_tSPATRange = m_byWildShot;
m_tSPATAI = m_byExcitedRate;
break;
default:
m_bCanNormalAT = TRUE;
m_bCanMagicAT = FALSE;
m_bCanSPAT = FALSE;
break;
}
*/
}
///////////////////////////////////////////////////////////////////
// NPC 林函狼 利阑 茫绰促.
//
BOOL CNpc::FindEnemy(COM *pCom)
{
BOOL bSearch = FALSE;
if(m_tNpcType == NPCTYPE_NPC || m_tNpcType == NPCTYPE_DOOR || m_tNpcType == NPCTYPE_GUILD_DOOR) return FALSE;
if(m_tNpcType == NPCTYPE_GUILD_NPC || m_tNpcType == NPCTYPE_GUILD_MARK) return FALSE;
if(m_byAX == 0 && m_byAZ == 0 ) return FALSE; // 郴啊 傍拜仿捞 绝栏搁 傍拜窍瘤 臼绰促
if(m_bySearchRange == 0) return FALSE;
if(m_tNpcType == NPCTYPE_GUARD) bSearch = TRUE;
if(m_tNpcType == NPCTYPE_GUILD_GUARD)
{
if(m_pGuardFortress && m_tRepairDamaged == NPC_DEAD_REPAIR_STATE) return FALSE;
// 傍己傈俊辑 秦寸 堡急器 HP啊 0捞搁 悼累 阂瓷烙
bSearch = TRUE;
}
if(!bSearch && !m_tNpcAttType && m_Target.id < 0 )
{
return FALSE;
}
else
{
// if( (GetTickCount() - m_dLastFind) < (DWORD)1000 )
if( (GetTickCount() - m_dLastFind) < (DWORD)2000 )
{
return FALSE;
}
}
m_dLastFind = GetTickCount();
// if(m_Target.id != -1) return TRUE;
int min_x, min_y, max_x, max_y;
min_x = m_sCurX - m_bySearchRange; if( min_x < 0 ) min_x = 0;
min_y = m_sCurY - m_bySearchRange; if( min_y < 0 ) min_y = 0;
max_x = m_sCurX + m_bySearchRange;
max_y = m_sCurY + m_bySearchRange;
if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 2;
if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 2;
int ix, iy;
int target_uid;
int uid;
int rank = 0;
USER *pUser = NULL;
CNpc *pNpc = NULL;
int tempLevel = 0, oldLevel = 1000;
for(ix = min_x; ix <= max_x; ix++)
{
for(iy = min_y; iy <= max_y; iy++)
{
target_uid = m_pOrgMap[ix][iy].m_lUser;
if( target_uid >= USER_BAND && target_uid < NPC_BAND )
{
uid = target_uid - USER_BAND;
pUser = GetUser(pCom, uid);
if( pUser != NULL && pUser->m_bLive == USER_LIVE)
{
if( ix != pUser->m_curx || iy != pUser->m_cury )
{
continue;
}
if(m_tNpcType == NPCTYPE_GUARD || m_tNpcType == NPCTYPE_GUILD_GUARD)
{
//rank = DEATH_RANK - CITY_RANK_INTERVAL;
if(pUser->m_sKillCount > 100 || pUser->m_bPkStatus)
{
m_Target.id = target_uid;
m_Target.failCount = 0;
m_Target.x = ix;
m_Target.y = iy;
return TRUE;
}
}
// 辨靛傈且锭绰 惑痢家蜡 辨靛盔篮 公矫
if(m_tNpcType == NPCTYPE_GUILD_GUARD)
{
if(m_tGuildWar == GUILD_WARRING)
{
//if(pUser->m_dwGuild == m_pGuardStore->m_iGuildSid) continue;
if(m_pGuardStore)
{
if(pUser->m_dwGuild == m_pGuardStore->m_iGuildSid) continue;
}
else if(m_pGuardFortress)
{
if(pUser->m_dwGuild == m_pGuardFortress->m_iGuildSid) continue;
}
m_Target.id = target_uid;
m_Target.failCount = 0;
m_Target.x = ix;
m_Target.y = iy;
return TRUE;
}
}
if(pUser->m_tIsOP == 1) continue; // 款康磊捞搁 公矫...^^
if(pUser->m_bPShopOpen == TRUE) continue; // User has personal shop
// if(pUser->m_dwHideTime > 0) continue; // 篮葱 惑怕搁 公矫等促.
//饶傍各...
if(!m_tNpcAttType) // 朝 傍拜茄 仇阑 茫绰促.
{
if(IsDamagedUserList(pUser) || (m_tNpcGroupType && m_Target.id == target_uid))
{
m_Target.id = target_uid;
m_Target.failCount = 0;
m_Target.x = ix;
m_Target.y = iy;
return TRUE;
}
}
else // 急傍各...
{
if(IsSurround(ix, iy) == TRUE) continue; //笛矾 阶咯 乐栏搁 公矫茄促.(盔芭府, 辟芭府 公矫)
USER *pTUser;
pTUser = pCom->GetUserUid(uid);
if ( pTUser == NULL ) continue;
tempLevel = pTUser->m_sLevel;
if(tempLevel <= oldLevel)
{
oldLevel = tempLevel;
m_Target.id = target_uid;
m_Target.failCount = 0;
m_Target.x = ix;
m_Target.y = iy;
return TRUE;
}
}
}
}
}
}
InitUserList(); // 酒公档 绝栏骨肺 府胶飘俊 包府窍绰 蜡历甫 檬扁拳茄促.
InitTarget();
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// 林函俊 唱甫 傍拜茄 蜡历啊 乐绰瘤 舅酒夯促
//
BOOL CNpc::IsDamagedUserList(USER *pUser)
{
// int count = m_arDamagedUserList.GetSize();
if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) return FALSE;
int sLen = strlen(pUser->m_strUserID);
if(sLen < 0 || sLen > CHAR_NAME_LENGTH) return FALSE;
for(int i = 0; i < NPC_HAVE_USER_LIST; i++)
{
if(strcmp(m_DamagedUserList[i].strUserID, pUser->m_strUserID) == 0) return TRUE;
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// Target 苞 NPC 埃 Path Finding阑 荐青茄促.
//
BOOL CNpc::GetTargetPath(COM* pCom)
{
USER* pUser = GetUser(pCom, m_Target.id - USER_BAND);
if(pUser == NULL)
{
InitTarget();
return FALSE;
}
if(pUser->m_sHP <= 0 || pUser->m_state != STATE_GAMESTARTED || pUser->m_bLive == FALSE)
{
InitTarget();
return FALSE;
}
/* if(strcmp(m_Target.szName, pUser->m_strUserID) != 0)
{
InitTarget();
return FALSE;
}
*/
int iTempRange = m_bySearchRange; // 老矫利栏肺 焊沥茄促.
// if(m_arDamagedUserList.GetSize()) iTempRange *= 2; // 傍拜罐篮 惑怕搁 茫阑 裹困 刘啊.
if(IsDamagedUserList(pUser)) iTempRange *= 2; // 傍拜罐篮 惑怕搁 茫阑 裹困 刘啊.
else iTempRange += 4;
int min_x = m_sCurX - iTempRange; if(min_x < 0) min_x = 0;
int min_y = m_sCurY - iTempRange; if(min_y < 0) min_y = 0;
int max_x = m_sCurX + iTempRange; if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
int max_y = m_sCurY + iTempRange; if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;
// 格钎痢捞 Search Range甫 哈绢唱瘤 臼绰瘤 八荤
CRect r = CRect(min_x, min_y, max_x+1, max_y+1);
if(r.PtInRect(CPoint(pUser->m_curx, pUser->m_cury)) == FALSE) return FALSE;
// Run Path Find ---------------------------------------------//
CPoint start, end;
start.x = m_sCurX - min_x;
start.y = m_sCurY - min_y;
end.x = pUser->m_curx - min_x;
end.y = pUser->m_cury - min_y;
m_ptDest.x = m_Target.x;
m_ptDest.y = m_Target.y;
m_min_x = min_x;
m_min_y = min_y;
m_max_x = max_x;
m_max_y = max_y;
return PathFind(start, end);
}
////////////////////////////////////////////////////////////////////////////////
// NPC 啊 Path Find 窍妨绰 付瘤阜 痢篮 泅犁 舅绊府硫惑 亲惑 捞悼阂啊 谅钎捞骨肺
// 付瘤阜 谅钎甫 荐沥
//
// ## 泅犁(2000-12-12) 菩胶颇牢靛 舅绊府硫捞 荐沥登绢 捞 窃荐绰 鞘夸绝澜 ##
BOOL CNpc::GetLastPoint(int sx, int sy, int& ex, int& ey)
{
int i;
int x = 0, y = 0;
int nx[] = {-1, 0, 1, 1, 1, 0, -1, -1};
int ny[] = {-1, -1, -1, 0, 1, 1, 1, 0};
BOOL bSearchDest = FALSE;
MAP* pMap = g_zone[m_ZoneIndex];
for(i = 0; i < sizeof(nx)/sizeof(nx[0]); i++)
{
x = ex + nx[i];
if(x >= pMap->m_sizeMap.cx) x--;
if(x < 0) x = 0;
y = ey + ny[i];
if(y >= pMap->m_sizeMap.cy) y--;
if(y < 0) y = 0;
if(m_pOrgMap[x][y].m_bMove == 0 && m_pOrgMap[x][y].m_lUser == 0)
{
ex = x;
ey = y;
bSearchDest = TRUE;
break;
}
}
if (bSearchDest) return TRUE;
int nSearchSize = max(abs(sx - ex), abs(sy - ey));
// ASSERT(nSearchSize);
for (i = nSearchSize; i > 0; i--)
{
x = sx + (ex - sx) * i / nSearchSize;
y = sy + (ey - sy) * i / nSearchSize;
if ((x + y) % 2 != 0) y++; //焊沥
if(m_pOrgMap[x][y].m_bMove == 0 && m_pOrgMap[x][y].m_lUser == 0)
{
ex = x;
ey = y;
bSearchDest = TRUE;
break;
}
}
if (!bSearchDest) return FALSE;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// NPC客 Target 苞狼 芭府啊 瘤沥 裹困焊促 累篮瘤 魄窜
//
BOOL CNpc::IsCloseTarget(COM* pCom, int nRange)
{
// 趣矫唱 版厚捍捞 NPC甫 傍拜窍霸 登搁 鸥百捞 蜡历啊 酒聪扼 NPC老 荐 档 乐促.
USER* pUser = GetUser(pCom, m_Target.id - USER_BAND);
if(pUser == NULL)
{
InitTarget();
return FALSE;
}
if(pUser->m_sHP <= 0 || pUser->m_state != STATE_GAMESTARTED || pUser->m_bLive == FALSE)
{
InitTarget();
return FALSE;
}
CPoint ptUser = ConvertToClient(pUser->m_curx, pUser->m_cury);
CPoint ptNpc = ConvertToClient(m_sCurX, m_sCurY);
//^^ 家付俊辑绰 芭府八祸捞 酒聪扼 甘 八祸栏肺 芭府拌魂 棺 肋给等 蜡历 谅钎甫 眉农窍绊 乐澜
int dx = abs(ptUser.x - ptNpc.x);
int dy = abs(ptUser.y - ptNpc.y);
int max_dist = __max(dx, dy);
if(max_dist > nRange * 2) return FALSE; // 努扼牢飘 谅钎绰 2瞒捞啊 茄伎捞骨肺 *2甫 茄促.
m_Target.x = pUser->m_curx;
m_Target.y = pUser->m_cury;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// NPC客 Target 苞狼 芭府啊 瘤沥 裹困焊促 累篮瘤 魄窜
//
BOOL CNpc::IsCloseTarget(USER *pUser, int nRange)
{
if(pUser == NULL)
{
return FALSE;
}
if(pUser->m_sHP <= 0 || pUser->m_state != STATE_GAMESTARTED || pUser->m_bLive == FALSE)
{
return FALSE;
}
CPoint ptUser = ConvertToClient(pUser->m_curx, pUser->m_cury);
CPoint ptNpc = ConvertToClient(m_sCurX, m_sCurY);
//^^ 家付俊辑绰 芭府八祸捞 酒聪扼 甘 八祸栏肺 芭府拌魂 棺 肋给等 蜡历 谅钎甫 眉农窍绊 乐澜
int dx = abs(pUser->m_curx - m_sCurX);
int dy = abs(pUser->m_cury - m_sCurY);
int max_dist = __max(dx, dy);
if(max_dist > nRange * 2) return FALSE;
InitTarget();
m_Target.id = pUser->m_uid + USER_BAND;
m_Target.x = pUser->m_curx;
m_Target.y = pUser->m_cury;
/* if(pUser->m_strUserID != NULL)
{
m_Target.nLen = strlen(pUser->m_strUserID);
if(m_Target.nLen <= CHAR_NAME_LENGTH) strncpy(m_Target.szName, pUser->m_strUserID, m_Target.nLen);
else ::ZeroMemory(m_Target.szName, sizeof(m_Target.szName));
}
*/ return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
// Path Find 肺 茫篮辨阑 促 捞悼 沁绰瘤 魄窜
//
BOOL CNpc::IsMovingEnd()
{
if( m_bRandMove ) // 8规氢 急琶 框流烙老锭
{
if( m_arRandMove.GetSize() ) return FALSE;
return TRUE;
}
if(!m_pPath) return TRUE;
int min_x = m_min_x;
int min_y = m_min_y;
if((m_sCurX - min_x) == m_vEndPoint.x && (m_sCurY - min_y) == m_vEndPoint.y) return TRUE;
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////////
// 秦寸 uid狼 USER* 甫 掘绰促.
//
USER* CNpc::GetUser(COM* pCom, int uid)
{
if(!pCom) return NULL;
//if(uid < 0 || uid >= MAX_USER) return NULL;
return pCom->GetUserUid(uid);
}
/////////////////////////////////////////////////////////////////////////////////
// Target 狼 困摹啊 促矫 辨茫扁甫 且 沥档肺 函沁绰瘤 魄窜
// 去鄂殿狼 惑怕捞惑 荤捞坷葱捞唱 胶懦殿捞 瘤盔登搁 捞 窃荐甫 捞侩窍搁 瞪 淀
//
BOOL CNpc::IsChangePath(COM* pCom, int nStep)
{
if(!m_pPath) return TRUE;
CPoint pt;
GetTargetPos(pCom, pt);
NODE* pTemp = m_pPath;
CPoint ptPath[2];
while(1)
{
if(pTemp == NULL) break;
if(pTemp->Parent)
{
ptPath[0].x = m_min_x + pTemp->x;
ptPath[0].y = m_min_y + pTemp->y;
pTemp = pTemp->Parent;
}
else
{
ptPath[1].x = m_min_x + pTemp->x;
ptPath[1].y = m_min_y + pTemp->y;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -