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

📄 npc.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:

/*		if(gTime.wDay >= 28 && gTime.wDay <= 29)					// 8老何磐 13老鳖瘤	
		{
			exp = (int)(exp * 1.2);
		}
*/


/*		if(pUser->m_bNowBuddy)
		{	
			plusExp = (DWORD)((double)(exp * 5)/100 + 0.5);		// 滚叼盔捞搁 公炼扒 5%捞垫		

			if(pUser->m_dwHiExpTime > 0)
			{
				pUser->GetExp(plusExp + (exp * 2));
			}
			else
			{
				if( (plusExp + exp) <= m_sExp ) pUser->GetExp(plusExp + exp);
				else pUser->GetExp(m_sExp);			
			}
		}	
		else
		{
			if(pUser->m_dwHiExpTime > 0) pUser->GetExp(exp * 2);
			else pUser->GetExp(exp);
		}*/

		//---------------------------------------------------------------------------------------------
		//--yskang 0.6 蜡丰 荤侩磊俊霸 橇府固决 力傍 - 版氰摹甫 臭咯霖促.
		if(pUser->m_iDisplayType != 5 && pUser->m_iDisplayType != 6)
			pUser->GetExpCommon((int)(exp * 1.1));
		else
			pUser->GetExpCommon((int)(exp * 0.8)); //公丰 荤侩磊绰 版氰摹甫 撤冕促.
		//---------------------------------------------------------------------------------------------
		

	}

//	GiveEventItemToUser(pUser);		//@@@@@@@@@@@@@@@@@@@@@@@@
}

//////////////////////////////////////////////////////////////////////////////
//	泅犁 各阑 扁霖栏肺 茄 拳搁 裹困救俊 乐绰瘤 魄窜
//
void CNpc::IsUserInSight(COM *pCom)
{
	int j;

	USER* pUser = NULL;

	int iSearchRange = m_bySearchRange;						// 烙矫肺 棱疽促.
	int min_x, min_y, max_x, max_y;

	min_x = m_sCurX - 12;		if( min_x < 0 ) min_x = 0;
	min_y = m_sCurY - 13;		if( min_y < 0 ) min_y = 0;
	max_x = m_sCurX + 12;
	max_y = m_sCurY + 13;

	if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
	if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;

	int ix, iy;
	int target_uid;
	int uid;
	int iLen = 0;

	for(j = 0; j < NPC_HAVE_USER_LIST; j++)
	{
		m_DamagedUserList[j].bIs = FALSE;
	}

	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;
				for(j = 0; j < NPC_HAVE_USER_LIST; j++)
				{												// 爱绊乐绰 府胶飘惑狼 蜡历客 鞍促搁		
					if(m_DamagedUserList[j].iUid == uid)		// 弥辆 ID甫 厚背秦辑 悼老窍搁	
					{
						pUser = pCom->GetUserUid(uid);		
						if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED || pUser->m_curz != m_sCurZ) continue;
																
						iLen = strlen(pUser->m_strUserID);
						if(iLen <= 0 || iLen > CHAR_NAME_LENGTH) continue;

						if(strcmp(pUser->m_strUserID, m_DamagedUserList[j].strUserID) == 0) 
						{										// 捞锭辑具 粮犁茄促绰 钎矫甫 茄促.
							m_DamagedUserList[j].bIs = TRUE;
						}
					}
				}
			}
		}
	}
}

//////////////////////////////////////////////////////////////////////////////
//	NPC DEAD Packet 阑 牢辟 蜡历俊霸 焊辰促.
//
int CNpc::SendDead(COM *pCom, int type)
{
//	ASSERT(pCom);
	if(!pCom) return 0;
	if(m_NpcState != NPC_DEAD || m_sHP > 0) return 0;

	CBufferEx TempBuf;

	CPoint pt = ConvertToClient(m_sCurX, m_sCurY);

	TempBuf.Add(DEAD);
	TempBuf.Add((short)(m_sNid + NPC_BAND));
	TempBuf.Add((short)pt.x);
	TempBuf.Add((short)pt.y);
		
	SendInsight(pCom, TempBuf, TempBuf.GetLength());
	if(type) GiveNpcHaveItem(pCom);	// 酒捞袍 冻备扁(版厚捍捞搁 救冻绢飘覆)
	
	return m_sRegenTime;
}

////////////////////////////////////////////////////////////////////////////////
//	林函俊 利捞 绝芭唱 荐悼各狼 版快 烙狼狼 痢栏肺 辨茫扁甫 茄 饶 框流牢促.
//
BOOL CNpc::RandomMove(COM *pCom)
{
	if(m_bySearchRange == 0) return FALSE;
	if(pCom == NULL) return FALSE;

	if(m_tNpcType == NPCTYPE_GUILD_DOOR)	return FALSE;	// 捞悼救窍霸...
	if(m_tNpcType == NPCTYPE_GUARD || m_tNpcType == NPCTYPE_GUILD_GUARD)	return FALSE;	// 捞悼救窍霸...
	// NPC 啊 檬扁 困摹甫 哈绢车绰瘤 魄窜茄促.
	BOOL bIsIn = IsInRange();

	MAP* pMap = g_zone[m_ZoneIndex];
	if( !pMap ) return FALSE;
	if( !pMap->m_pMap ) return FALSE;

	CPoint pt;
	int nLoop = 0;
	int nDestX = -1, nDestY = -1;
	int min_x, min_y, max_x, max_y;
	int temp_minx = 0, temp_miny = 0, temp_maxx = 0, temp_maxy = 0;

	CRect rectIn;

	if(bIsIn)	// NPC 啊 檬扁 困摹甫 哈绢唱瘤 臼疽栏搁
	{
/*alisia
		int temp_range = m_bySearchRange / 2;

		min_x = m_sCurX - temp_range;	if(min_x < 0) min_x = 0;
		min_y = m_sCurY - temp_range;	if(min_y < 0) min_y = 0;
		max_x = m_sCurX + temp_range;	if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
		max_y = m_sCurY + temp_range;	if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;

		rectIn.IntersectRect(CRect(m_nInitMinX, m_nInitMinY, m_nInitMaxX, m_nInitMaxY), CRect(min_x, min_y, max_x, max_y));

		nLoop = 0;
		while(1)
		{
			nDestX = myrand(rectIn.left, rectIn.right);
			nDestY = myrand(rectIn.top, rectIn.bottom);

			if(pMap->m_pMap[nDestX][nDestY].m_bMove != 0 || pMap->m_pMap[nDestX][nDestY].m_lUser != 0)
			{
				if(nLoop++ >= 10) 
				{
					TRACE("NOT FIND~~\n");
					return FALSE;
				}
				continue;
			}
			
			break;
		}
alisia*/

		m_bRandMove = TRUE;		// 泅犁 框流烙捞 8规氢 急琶 框流烙牢瘤甫 唱鸥辰促 - PathFind() 窃荐 救俊辑 府悸茄促

		m_arRandMove.RemoveAll();

		int axis_x[3];	axis_x[0] = -1;	axis_x[1] = 0;	axis_x[2] = 1;
		int axis_y[3];	axis_y[0] = -1;	axis_y[1] = 0;	axis_y[2] = 1;
		int rand_x, rand_y, rand_d;

		rand_x = myrand( 0, 2 );
		rand_y = myrand( 0, 2 );
		rand_d = myrand( 1, 5 );

		for( int i = 1; i <= rand_d; i++ )
		{
			m_arRandMove.Add( CPoint( axis_x[rand_x] * i, axis_y[rand_y] * i ) );
		}

		m_min_x = m_sCurX;
		m_min_y = m_sCurY;

		return TRUE;
	}
	else		// NPC 啊 檬扁 困摹甫 哈绢车栏搁
	{
		int x = 0, y = 0;
		
		min_x = m_sCurX;
		min_y = m_sCurY;
		max_x = m_sCurX;
		max_y = m_sCurY;

		if(m_nInitMinX < m_sCurX)	{min_x -= m_bySearchRange;	x += 1;} if(min_x < 0) min_x = 0;
		if(m_nInitMinY < m_sCurY)	{min_y -= m_bySearchRange;	y += 1;} if(min_y < 0) min_y = 0;
		if(m_nInitMaxX > m_sCurX)	{max_x += m_bySearchRange;	x += 1;} if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
		if(m_nInitMaxY > m_sCurY)	{max_y += m_bySearchRange;	y += 1;} if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;
				
		nLoop = 0;
		while(1)
		{
			nDestX = min_x + (rand() % (m_bySearchRange * x + 1)); 
			if(nDestX > max_x) nDestX = max_x;

			nDestY = min_y + (rand() % (m_bySearchRange * y + 1));
			if(nDestY > max_y) nDestY = max_y;

			if(pMap->m_pMap[nDestX][nDestY].m_bMove != 0 || pMap->m_pMap[nDestX][nDestY].m_lUser != 0)
			{
				if(nLoop++ >= 10) return FALSE;
				continue;
			}
			
			break;
		}
	}

	if(nDestX < 0 || nDestY < 0)
	{
		return FALSE;
	}

	// Run Path Find ---------------------------------------------//
	CPoint start, end;
	start.x = m_sCurX - min_x;
	start.y = m_sCurY - min_y;
	end.x = nDestX - min_x;
	end.y = nDestY - min_y;

	if(start.x < 0 || start.y < 0 || end.x < 0 || end.y < 0)
	{
		return FALSE;
	}

	m_ptDest.x = nDestX;
	m_ptDest.y = nDestY;

	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 啊 檬扁 积己困摹 救俊 乐绰瘤 八荤
//
BOOL CNpc::IsInRange()
{
	// NPC 啊 檬扁 困摹甫 哈绢车绰瘤 魄窜茄促.
//	CRect rect(m_nInitMinX, m_nInitMinY, m_nInitMaxX, m_nInitMaxY);
	
//	return rect.PtInRect(CPoint(m_sCurX, m_sCurY));

	if( m_nInitMinX > m_sCurX || m_nInitMaxX < m_sCurX ) return FALSE;
	if( m_nInitMinY > m_sCurY || m_nInitMaxY < m_sCurY ) return FALSE;

	return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////
//	矫具啊 函版灯绰瘤 魄窜窍绊 函版灯促搁 函版郴侩阑 努扼捞攫飘肺 傈价茄促.
//
void CNpc::SightRecalc(COM* pCom)
{
	int sx, sy;

	sx = m_sCurX / SIGHT_SIZE_X;
	sy = m_sCurY / SIGHT_SIZE_Y;

	int dir_x = 0;
	int dir_y = 0;

	if( sx == m_presx && sy == m_presy ) return;
	
	if( m_presx == -1 || m_presy == -1 )
	{
		dir_x = 0;
		dir_y = 0;
	}
	else
	{
		if( sx > m_presx && abs(sx-m_presx) == 1 )		dir_x = DIR_H;
		if( sx < m_presx && abs(sx-m_presx) == 1 )		dir_x = DIR_L;
		if( sy > m_presy && abs(sy-m_presy) == 1 )		dir_y = DIR_H;
		if( sy < m_presy && abs(sy-m_presy) == 1 )		dir_y = DIR_L;
		if( abs(sx-m_presx) > 1 )						dir_x = DIR_OUTSIDE;
		if( abs(sy-m_presy) > 1 )						dir_y = DIR_OUTSIDE;
	}

	int prex = m_presx;
	int prey = m_presy;
	m_presx = sx;
	m_presy = sy;

	SendUserInfoBySightChange(dir_x, dir_y, prex, prey, pCom);
}

//////////////////////////////////////////////////////////////////////////////////////////
//	矫具函版栏肺 牢茄 蜡历沥焊 傈价
//
void CNpc::SendUserInfoBySightChange(int dir_x, int dir_y, int prex, int prey, COM *pCom)
{
	int min_x = 0, min_y = 0;
	int max_x = 0, max_y = 0;

	int sx = m_presx;
	int sy = m_presy;

	int modify_index = 0;
	char modify_send[1024];		::ZeroMemory(modify_send, sizeof(modify_send));
	FillNpcInfo(modify_send, modify_index, INFO_MODIFY);

	int delete_index = 0;
	char delete_send[1024];		::ZeroMemory(delete_send, sizeof(delete_send));
	FillNpcInfo(delete_send, delete_index, INFO_DELETE);

	if( prex == -1 || prey == -1 )
	{
		min_x = (sx-1)*SIGHT_SIZE_X;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
		return;
	}
	if( dir_x == DIR_OUTSIDE || dir_y == DIR_OUTSIDE )
	{
		min_x = (prex-1)*SIGHT_SIZE_X;
		max_x = (prex+2)*SIGHT_SIZE_X;
		min_y = (prey-1)*SIGHT_SIZE_Y;
		max_y = (prey+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
		min_x = (sx-1)*SIGHT_SIZE_X;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
		return;
	}
	if( dir_x > 0 )
	{
		min_x = (prex-1)*SIGHT_SIZE_X;
		max_x = (prex)*SIGHT_SIZE_X;
		min_y = (prey-1)*SIGHT_SIZE_Y;
		max_y = (prey+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
		min_x = (sx+1)*SIGHT_SIZE_X;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
	}
	if( dir_y > 0 )
	{
		min_x = (prex-1)*SIGHT_SIZE_X;
		max_x = (prex+2)*SIGHT_SIZE_X;
		min_y = (prey-1)*SIGHT_SIZE_Y;
		max_y = (prey)*SIGHT_SIZE_Y;
		SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
		min_x = (sx-1)*SIGHT_SIZE_X;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy+1)*SIGHT_SIZE_Y;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
	}
	if( dir_x < 0 )
	{
		min_x = (prex+1)*SIGHT_SIZE_X;
		max_x = (prex+2)*SIGHT_SIZE_X;
		min_y = (prey-1)*SIGHT_SIZE_Y;
		max_y = (prey+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
		min_x = (sx-1)*SIGHT_SIZE_X;
		max_x = (sx)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
	}
	if( dir_y < 0 )
	{
		min_x = (prex-1)*SIGHT_SIZE_X;
		max_x = (prex+2)*SIGHT_SIZE_X;
		min_y = (prey+1)*SIGHT_SIZE_Y;
		max_y = (prey+2)*SIGHT_SIZE_Y;
		SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
		min_x = (sx-1)*SIGHT_SIZE_X;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y;
		max_y = (sy)*SIGHT_SIZE_Y;
		SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
	}
}

////////////////////////////////////////////////////////////////////////////////
//	茄拳搁郴狼 蜡历俊霸父 沥焊傈价
//
void CNpc::SendExactScreen(COM* pCom, TCHAR *pBuf, int nLength)
{
	if(nLength <= 0 || nLength >= SEND_BUF_SIZE) return;
	
	SEND_DATA* pNewData = NULL;
	pNewData = new SEND_DATA;
	if(pNewData == NULL) return;

	pNewData->flag = SEND_SCREEN;
	pNewData->len = nLength;

	::CopyMemory(pNewData->pBuf, pBuf, nLength);

	pNewData->uid = 0;
	pNewData->x = m_sCurX;
	pNewData->y = m_sCurY;
	pNewData->z = m_sCurZ;
	pNewData->zone_index = m_ZoneIndex;

	pCom->Send(pNewData);
	if(pNewData) delete pNewData;
}

///////////////////////////////////////////////////////////////////////////////
//	矫具救俊 乐绰 蜡历俊霸 单捞磐 傈价
//
void CNpc::SendInsight(COM* pCom, TCHAR *pBuf, int nLength)
{
/*
	if(nLength <= 0 || nLength >= SEND_BUF_SIZE) return;
	
	SEND_DATA* pNewData = NULL;
	pNewData = new SEND_DATA;
	if(pNewData == NULL) return;

	pNewData->flag = SEND_INSIGHT;
	pNewData->len = nLength;

	::CopyMemory(pNewData->pBuf, pBuf, nLength);

	pNewData->uid = 0;
	pNewData->x = m_sCurX;
	pNewData->y = m_sCurY;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -