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

📄 npc.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -