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