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

📄 com.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	for( int i = 0; i < g_cell.GetSize(); i++ )
	{
		if( g_cell[i] )
		{
			if( g_cell[i]->m_Zone == iZone )
			{
				bFound = TRUE;
				iZoneIndex = i;
				break;
			}
		}
	}

	if( !bFound ) return;
	// alisia

	USER *pUser1 = NULL;
	USER *pUser2 = NULL;

	for( i = 0; i < MAX_USER; i += 2 )
	{
		pUser1 = g_cell[iZoneIndex]->m_pCom->GetUserUid(i);
		pUser2 = g_cell[iZoneIndex]->m_pCom->GetUserUid(i+1);

		if(pUser1 != NULL && pUser1->m_state == STATE_GAMESTARTED && pUser1->m_curz == iZone) pUser1->SetWeather(tType, tOnOff);
		if(pUser2 != NULL && pUser2->m_state == STATE_GAMESTARTED && pUser2->m_curz == iZone) pUser2->SetWeather(tType, tOnOff);

		pUser1 = NULL;
		pUser2 = NULL;
	}
}

////////////////////////////////////////////////////////////////////////////////////
//	立加茄 葛电 蜡历俊霸 矫埃阑 舅妨霖促.
//
void COM::SendTimeToAll()
{
	BYTE tType = 1;

	USER *pUser = NULL;

	for(int i = 0; i < MAX_USER; i++)
	{
		pUser = GetUserUid(i);

		if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;
		
		pUser->SetWeather(tType, 1);
	}
}

////////////////////////////////////////////////////////////////////////
// CPU狼 肮荐甫 备茄促.
//
void COM::GetCPUCount()
{
	SYSTEM_INFO	SystemInfo;
	GetSystemInfo(&SystemInfo);
	m_dwConcurrency = SystemInfo.dwNumberOfProcessors;
}

////////////////////////////////////////////////////////////////////////
//	Send Data
//
void COM::Send(SEND_DATA *pData)
{
	USER*	pUser = NULL;
	MAP*	pMap = NULL;
	int		min_x, max_x, min_y, max_y;
	int		sx, sy;
	int		i, j;
	int		temp_uid;

	if( !pData )
	{
		return;
	}

	if( !pData->len || pData->len <= 0 || pData->len >= RECV_BUF_SIZE )
	{
		TRACE("Data Length OverFlow - Send(SEND_DATA *pData)\n");
		return;
	}

	switch( pData->flag )
	{
	case	SEND_USER:
		if( pData->uid < 0 || pData->uid >= MAX_USER )
		{
			return;
		}

		pUser = GetUserUid(pData->uid);
		if ( pUser == NULL ) return;

		if( pUser->m_state == STATE_DISCONNECTED || pUser->m_state == STATE_LOGOUT )
		{
			return;
		}

		Send( pUser, pData->pBuf, pData->len );
		break;
		
	case	SEND_INSIGHT:
		sx = pData->x / SIGHT_SIZE_X;
		sy = pData->y / SIGHT_SIZE_Y;
		
		min_x = (sx-1)*SIGHT_SIZE_X; if( min_x < 0 ) min_x = 0;
		max_x = (sx+2)*SIGHT_SIZE_X;
		min_y = (sy-1)*SIGHT_SIZE_Y; if( min_y < 0 ) min_y = 0;
		max_y = (sy+2)*SIGHT_SIZE_Y;
		
		pMap = g_zone[pData->zone_index];
		if( !pMap ) return;
		
		if( max_x >= pMap->m_sizeMap.cx ) max_x = pMap->m_sizeMap.cx - 1;
		if( max_y >= pMap->m_sizeMap.cy ) max_y = pMap->m_sizeMap.cy - 1;
		
		for( i = min_x; i < max_x; i++ )
		{
			for( j = min_y; j < max_y; j++ )
			{				
				temp_uid = pMap->m_pMap[i][j].m_lUser;
				if(temp_uid < USER_BAND || temp_uid >= NPC_BAND) continue;
				else temp_uid -= USER_BAND;
				
				if( temp_uid >= 0 && temp_uid < MAX_USER )
				{
					pUser = GetUserUid(temp_uid);
					if ( pUser == NULL ) continue;
					
					if( pUser->m_state == STATE_GAMESTARTED )
					{
						if( pUser->m_curx == i && pUser->m_cury == j && pUser->m_curz == pData->z )
						{
							Send( pUser, pData->pBuf, pData->len );
						}
					}
				}
			}
		}
		break;
	
	case	SEND_RANGE:
		pMap = g_zone[pData->zone_index];
		if( !pMap ) return;
		
		min_x = pData->rect.left;		if(min_x < 0 ) min_x = 0;
		max_x = pData->rect.right;		if(max_x >= pMap->m_sizeMap.cx ) max_x = pMap->m_sizeMap.cx - 1;
		min_y = pData->rect.top;		if(min_y < 0 ) min_y = 0;
		max_y = pData->rect.bottom;		if(max_y >= pMap->m_sizeMap.cy ) max_y = pMap->m_sizeMap.cy - 1;

		for( i = min_x; i < max_x; i++ )
		{
			for( j = min_y; j < max_y; j++ )
			{
				temp_uid = pMap->m_pMap[i][j].m_lUser;
				if(temp_uid < USER_BAND || temp_uid >= NPC_BAND) continue;
				else temp_uid -= USER_BAND;

				if( temp_uid >= 0 && temp_uid < MAX_USER )
				{
					pUser = GetUserUid(temp_uid);
					// IKING 2001.1.
					if ( pUser == NULL ) continue;
					//
					
					if( pUser->m_state == STATE_GAMESTARTED )
					{
						if( pUser->m_curx == i && pUser->m_cury == j && pUser->m_curz == pData->z )
						{
							Send( pUser, pData->pBuf, pData->len);
						}
					}
				}
			}
		}
		
		break;
		
	case	SEND_ZONE:
		for(i = 0; i < MAX_USER; i++)
		{
			pUser = GetUserUid(i);

			if( !pUser ) continue;
			if( pUser->m_state != STATE_GAMESTARTED )	continue;
			
			if( pData->z == pUser->m_curz )
			{
				if( pUser->m_state == STATE_GAMESTARTED )
				{
					Send( pUser, pData->pBuf, pData->len );
				}
			}
		}
		break;

	case	SEND_ALL:
		for(i = 0; i < MAX_USER; i++)
		{
			pUser = GetUserUid(i);
			
			if( !pUser ) continue;
			if( pUser->m_state != STATE_GAMESTARTED )	continue;
			
			Send( pUser, pData->pBuf, pData->len );
		}
		break;

	case	SEND_SCREEN:
		min_x = pData->x - 16; if( min_x < 0 ) min_x = 0;
		max_x = pData->x + 16;
		min_y = pData->y - 16; if( min_y < 0 ) min_y = 0;
		max_y = pData->y + 16;
		
		pMap = g_zone[pData->zone_index];
		if( !pMap ) return;
		
		if( max_x >= pMap->m_sizeMap.cx ) max_x = pMap->m_sizeMap.cx - 1;
		if( max_y >= pMap->m_sizeMap.cy ) max_y = pMap->m_sizeMap.cy - 1;
		
		for( i = min_x; i < max_x; i++ )
		{
			for( j = min_y; j < max_y; j++ )
			{
				if( ( abs( pData->x - i ) + abs( pData->y - j ) ) > 16 ) continue;

				temp_uid = pMap->m_pMap[i][j].m_lUser;

				if(temp_uid < USER_BAND || temp_uid >= NPC_BAND) continue;
				else temp_uid -= USER_BAND;
				
				if( temp_uid >= 0 && temp_uid < MAX_USER )
				{
					pUser = GetUserUid(temp_uid);
					if ( pUser == NULL ) continue;
					
					if( pUser->m_state == STATE_GAMESTARTED )
					{
						Send( pUser, pData->pBuf, pData->len );
					}
				}
			}
		}
		break;

	default:
		break;
	}
}

////////////////////////////////////////////////////////////////////////
//	Send Data
//
void COM::Send(USER *pUser, TCHAR *pBuf, int nLength)
{
	if(pUser == NULL) return;

	pUser->Send(pBuf, nLength);
}

BOOL COM::SetThrowItem(ItemList *pItem, int x, int y, int z)
{
	if( !pItem )
	{
		return FALSE;
	}

	MAP* pAddMap = g_zone[z];

	if( !pAddMap ) return FALSE;
	if( pItem->tType != TYPE_MONEY && pItem->tType != TYPE_ITEM) return FALSE;

	CPoint t = ConvertToClient( x, y, pAddMap->m_vMoveCell.m_vDim.cx, pAddMap->m_vMoveCell.m_vDim.cy );
	if( t.x == -1 || t.y == -1 ) return FALSE;

	// IKING 2001.1.
	EnterCriticalSection( &m_critThrowItem );

	m_ThrowItemArray[m_ThrowAddIndex]->m_pItem = pItem;
	m_ThrowItemArray[m_ThrowAddIndex]->m_z = z;			// 开矫 粮锅龋啊 酒聪绊 Zone Index 捞促
	m_ThrowItemArray[m_ThrowAddIndex]->m_x = x;
	m_ThrowItemArray[m_ThrowAddIndex]->m_y = y;

	pAddMap->m_pMap[x][y].iIndex = m_ThrowAddIndex;

	m_ThrowAddIndex++;
	if( m_ThrowAddIndex >= MAX_THROW_ITEM ) m_ThrowAddIndex = 0;

	LeaveCriticalSection( &m_critThrowItem );

	int index = 0;
	char temp_send[1024];

	SetByte( temp_send, FIELD_ITEM_INFO, index );
	SetShort( temp_send, 1, index );
	SetByte( temp_send, ITEM_INFO_MODIFY, index );

	SetShort( temp_send, t.x, index );
	SetShort( temp_send, t.y, index );

	if( pItem->tType == TYPE_MONEY )
	{
		SetShort( temp_send, TYPE_MONEY_SID, index );
		SetDWORD( temp_send, pItem->dwMoney, index );
		SetByte( temp_send, 0, index);
	}
	else
	{
		SetShort( temp_send, pItem->sSid, index );
		SetDWORD( temp_send, pItem->sCount, index );
		SetByte( temp_send, pItem->tIQ, index);
	}

	SEND_DATA* pNewData = NULL;

	pNewData = new SEND_DATA;

	if( !pNewData ) return TRUE;

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

	memcpy( pNewData->pBuf, temp_send, index );

	pNewData->uid = 0;
	pNewData->x = x;
	pNewData->y = y;
	pNewData->z = pAddMap->m_Zone;
	pNewData->zone_index = z;

	// IKING 2001.1.
	//EnterCriticalSection( &(m_critSendData) );
	//m_arSendData.Add( pNewData );
	//LeaveCriticalSection( &(m_critSendData) );
	//PostQueuedCompletionStatus( m_hSendIOCP, 0, 0, NULL );
	Send(pNewData);
	delete pNewData;
	//

	return TRUE;
}

void COM::DelThrowItem()
{
	ItemList* pThrowItem = NULL;

	int z, x, y;

	MAP* pDelMap = NULL;

	// IKING 2001.1.
	EnterCriticalSection( &m_critThrowItem );
	pThrowItem = m_ThrowItemArray[m_ThrowAddIndex]->m_pItem;
	//

	if( pThrowItem )
	{
		z = m_ThrowItemArray[m_ThrowAddIndex]->m_z;		// 粮锅龋啊 酒聪绊 Zone Index 捞促
		x = m_ThrowItemArray[m_ThrowAddIndex]->m_x;
		y = m_ThrowItemArray[m_ThrowAddIndex]->m_y;

		// IKING 
		if(z < 0 || z >= g_zone.GetSize())
		{
			LeaveCriticalSection( &m_critThrowItem );
			return;
		}
		
		pDelMap = g_zone[z];

		if( pDelMap )
		{
			if(x <= -1 || y <= -1)
			{
				LeaveCriticalSection( &m_critThrowItem );
				return;
			}

			if(x >= pDelMap->m_sizeMap.cx || y >= pDelMap->m_sizeMap.cy)
			{
				LeaveCriticalSection( &m_critThrowItem );
				return;
			}

			CPoint t = ConvertToClient( x, y, pDelMap->m_vMoveCell.m_vDim.cx, pDelMap->m_vMoveCell.m_vDim.cy );
			if( t.x == -1 || t.y == -1 )
			{
				LeaveCriticalSection( &m_critThrowItem );
				return;
			}

			pDelMap->m_pMap[x][y].iIndex = -1;
			m_ThrowItemArray[m_ThrowAddIndex]->m_pItem = NULL;

			int index = 0;
			char temp_send[1024];

			SetByte( temp_send, FIELD_ITEM_INFO, index );
			SetShort( temp_send, 1, index );
			SetByte( temp_send, ITEM_INFO_DELETE, index );

			SetShort( temp_send, t.x, index );
			SetShort( temp_send, t.y, index );

			if(pThrowItem->tType == TYPE_ITEM)
			{
				SetShort( temp_send, pThrowItem->sSid, index );
				SetDWORD( temp_send, pThrowItem->sCount, index );
				SetByte( temp_send, pThrowItem->tIQ, index);
			}
			else
			{
				SetShort( temp_send, TYPE_MONEY_SID, index );
				SetDWORD( temp_send, pThrowItem->dwMoney, index );
				SetByte( temp_send, 0, index);
			}

			delete pThrowItem;

			LeaveCriticalSection( &m_critThrowItem );

			SEND_DATA* pNewData = NULL;

			pNewData = new SEND_DATA;

			if( !pNewData ) return;

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

			memcpy( pNewData->pBuf, temp_send, index );

			pNewData->uid = 0;
			pNewData->x = x;
			pNewData->y = y;
			pNewData->z = pDelMap->m_Zone;
			pNewData->zone_index = z;

			//EnterCriticalSection( &(m_critSendData) );
			//m_arSendData.Add( pNewData );
			//LeaveCriticalSection( &(m_critSendData) );
			//PostQueuedCompletionStatus( m_hSendIOCP, 0, 0, NULL );
			Send(pNewData);
			delete pNewData;

		}
	}
	else
		LeaveCriticalSection( &m_critThrowItem );

	// 瘤陛 眠啊且 镑俊 酒捞袍捞 绝带啊, 酒捞袍阑 瘤快促 角菩茄 版快捞促
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//	鞘靛惑痢俊 措茄 辨靛傈 矫埃阑 眉农窍绊 林牢捞 乐绰 惑痢俊 措茄 技陛阑 辨靛芒绊肺 利赋茄促.
//
void COM::CheckGuildWarTime()
{
	SYSTEMTIME guildTime;
	GetLocalTime(&guildTime);
	DWORD dwCurrTick = GetTickCount();					// 力茄 矫埃郴狼 辨靛傈阑 眉农...

	COleDateTime CurrTime = COleDateTime(guildTime);
//	SYSTEMTIME st;

	int i, j;
	int nTime = 0;
	static int nState = 0;
	CString strMsg;

	DWORD dwTick = 0, dwInter = 0;
	DWORD dwInterTime = 0;	

	for(i = 0; i < MAX_SINGLE_EVENT; i++)
	{
		if(g_QuestEventZone.m_SingleEventZone[i].m_lUsed == 1)
		{			
			dwTick = dwInter = dwInterTime = 0;
			dwTick = g_QuestEventZone.m_SingleEventZone[i].m_dwStartTime;
			dwInterTime = (DWORD)g_QuestEventZone.m_SingleEventZone[i].m_tEventTime;
			dwInter = g_QuestEventZone.m_SingleEventZone[i].m_dwInterTick;

			if(dwCurrTick - dwTick > 60000 * dwInterTime)
			{
				g_QuestEventZone.RemoveUserInEventZone(i);
				g_QuestEventZone.m_SingleEventZone[i].m_lUsed = 0;

⌨️ 快捷键说明

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