avatar_InsurgenT

2 вопроса к программистам о серверных файлах в MU Online

Автор InsurgenT, 2010 Апр. 23, 20:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlineсерверные файлы MUпомощь

InsurgenT

У меня 2 вопроса ко всем прогграмистам на этом форуме что занимаются серверными файлами.

1.) Есть ли ограничение на количество вешей в EventItemBag ?

2.) Каким образом можно воплотить общий чат (/post) для всех суб-серверов ?
Пример:
[POST1]: text...
[POST2]: text...
[POST3]: text...
где цифры 1-2-3 ето сервера.
Видел работающию систему на старом МЛД сервере...

Заранее спасибо за ваши ответы.

InsurgenT

хех  

з.ы. думал что хоть идею с постом заценят...


Mr.Kernighan

#2
1) Никогда не задавался таким вопросом.
2) Может быть проверять port'ы что прослушиваются gameserver'ом, если они активны, отсылать сообщения по sub-серверам. (не знаю правильно это или нет, первая мысль что пришла в голову)

BeL4eNaK

#3
1) Осмелюсь предположить, что 255, максимальный параметр для подавляющей части значений в Му...
2) Не по-моей части ))

LeGrand

1. 512 максимально, айди вещи в ГСЕ высчитывается как Type*512 + Id
2. GCServerMsgStringSend, рыть тут.

Например чтобы послать данные юзеру, тебе нужен его индекс. Данные хранятся в единой gObj, тогда нам нужно писать сервер, а ГСы, это клиенты. И синхронизировать данные между собой, чтобы функция GCServerMsgStringSend посылала данные не на один сервер, а на все сервера подключенные к твоему "импровизированному" серверу. Выполнить эмуляцию функции GCServerMsgStringSend и DataSend.
BOOL DataSend(int aIndex, unsigned char* lpMsg, DWORD dwSize)
{
unsigned long SendBytes;
_PER_SOCKET_CONTEXT * lpPerSocketContext;
unsigned char * SendBuf;


if ( aIndex < OBJ_STARTUSERINDEX )
{
return true;
}


EnterCriticalSection(&criti);

if ( ((aIndex < 0)? FALSE : (aIndex > OBJMAX-1)? FALSE : TRUE )  == FALSE )
{
LogAdd("error-L2 : Index(%d) %x %x %x ", dwSize, lpMsg[0], lpMsg[1], lpMsg[2]);
LeaveCriticalSection(&criti);
return false;
}

if ( lpMsg[0] == 0xC3 || lpMsg[0] == 0xC4 )
{
int ret;
BYTE btsize;

if ( lpMsg[0] == 0xC3 )
{
btsize = lpMsg[1];
lpMsg[1]=gNSerialCheck[aIndex].GetSendSerial();

ret = g_SimpleModulusSC.Encrypt(&ExSendBuf[2], &lpMsg[1], dwSize-1);
ExSendBuf[0] = 0xC3;
ExSendBuf[1] = ret + 2;
SendBuf = ExSendBuf;
dwSize = ret + 2;
lpMsg[1] = btsize;
}
else
{
btsize = lpMsg[2];
lpMsg[2] = gNSerialCheck[aIndex].GetSendSerial();
ret = g_SimpleModulusSC.Encrypt(&ExSendBuf[3], &lpMsg[2], dwSize-2);
ExSendBuf[0] = 0xC4;
ExSendBuf[1] = SET_NUMBERH(ret +3 );
ExSendBuf[2] = SET_NUMBERL(ret+3);
SendBuf = ExSendBuf;
dwSize = ret + 3;
lpMsg[2] = btsize;
}
}
else
{
SendBuf = lpMsg;
}

if ( gObj[aIndex].Connected < PLAYER_CONNECTED )
{
LeaveCriticalSection(&criti);
return FALSE;
}

lpPerSocketContext= gObj[aIndex].PerSocketContext;

if ( dwSize > sizeof(lpPerSocketContext->IOContext[0].Buffer))
{
LogAdd("Error : Max msg(%d) %s %d", dwSize, __FILE__, __LINE__);
CloseClient(aIndex);
LeaveCriticalSection(&criti);
return false;
}

_PER_IO_CONTEXT  * lpIoCtxt;

lpIoCtxt = &lpPerSocketContext->IOContext[1];

if ( lpIoCtxt->nWaitIO > 0 )
{
if ( ( lpIoCtxt->nSecondOfs + dwSize ) > MAX_IO_BUFFER_SIZE-1 )
{
LogAdd("(%d)error-L2 MAX BUFFER OVER %d %d %d [%s][%s]", aIndex, lpIoCtxt->nTotalBytes, lpIoCtxt->nSecondOfs, dwSize, gObj[aIndex].AccountID, gObj[aIndex].Name);
lpIoCtxt->nWaitIO = 0;
CloseClient(aIndex);
LeaveCriticalSection(&criti);
return true;
}

memcpy( &lpIoCtxt->BufferSecond[lpIoCtxt->nSecondOfs], SendBuf, dwSize);
lpIoCtxt->nSecondOfs += dwSize;
LeaveCriticalSection(&criti);
return true;
}

lpIoCtxt->nTotalBytes = 0;

if ( lpIoCtxt->nSecondOfs > 0 )
{
memcpy(lpIoCtxt->Buffer, lpIoCtxt->BufferSecond, lpIoCtxt->nSecondOfs);
lpIoCtxt->nTotalBytes = lpIoCtxt->nSecondOfs;
lpIoCtxt->nSecondOfs = 0;
}

if ( (lpIoCtxt->nTotalBytes+dwSize) > MAX_IO_BUFFER_SIZE-1 )
{
LogAdd("(%d)error-L2 MAX BUFFER OVER %d %d [%s][%s]", aIndex, lpIoCtxt->nTotalBytes, dwSize, gObj[aIndex].AccountID, gObj[aIndex].Name);
lpIoCtxt->nWaitIO = 0;
CloseClient(aIndex);
LeaveCriticalSection(&criti);
return FALSE;
}

memcpy( &lpIoCtxt->Buffer[lpIoCtxt->nTotalBytes], SendBuf, dwSize);
lpIoCtxt->nTotalBytes += dwSize;
lpIoCtxt->wsabuf.buf = (char*)&lpIoCtxt->Buffer;
lpIoCtxt->wsabuf.len = lpIoCtxt->nTotalBytes;
lpIoCtxt->nSentBytes = 0;
lpIoCtxt->IOOperation = 1;


if ( WSASend( gObj[aIndex].m_socket, &lpIoCtxt->wsabuf , 1, &SendBytes, 0, &lpIoCtxt->Overlapped, NULL) == -1 )
{

if ( WSAGetLastError() != WSA_IO_PENDING )
{
lpIoCtxt->nWaitIO = 0;


if ( lpIoCtxt->wsabuf.buf[0] == 0xC1 )
{
LogAdd("(%d)WSASend(%d) failed with error [%x][%x] %d %s ", __LINE__, aIndex, (BYTE)lpIoCtxt->wsabuf.buf[0],
(BYTE)lpIoCtxt->wsabuf.buf[2], WSAGetLastError(), gObj[aIndex].Ip_addr);
}
else if ( lpIoCtxt->wsabuf.buf[0] == 0xC2 )
{
LogAdd("(%d)WSASend(%d) failed with error [%x][%x] %d %s ", __LINE__, aIndex, (BYTE)lpIoCtxt->wsabuf.buf[0],
(BYTE)lpIoCtxt->wsabuf.buf[3], WSAGetLastError(), gObj[aIndex].Ip_addr);
}
CloseClient(aIndex);
LeaveCriticalSection(&criti);
return false;
}
}
else
{
lpPerSocketContext->dwIOCount ++;
}


lpIoCtxt->nWaitIO = 1;
LeaveCriticalSection(&criti);
return true;
}
void GCServerMsgStringSend(LPSTR  szMsg, int aIndex, BYTE type)
{
PMSG_NOTICE pNotice;

TNotice::MakeNoticeMsg((TNotice*)&pNotice, type, szMsg);
DataSend(aIndex, (UCHAR*)&pNotice, pNotice.h.size);
}
void TNotice::MakeNoticeMsg(void * lpNotice, BYTE btType, char * szNoticeMsg)
{
PMSG_NOTICE * pNotice = (PMSG_NOTICE *)lpNotice;
pNotice->type  = btType;

#ifdef GS_UNICODE
unsigned char szTempMsg[4096]={0};
memset( pNotice->szNoticeMessage, 0, sizeof(pNotice->szNoticeMessage));
MultiByteToWideChar( 1258, 0, (char*)szNoticeMsg,  strlen((char*)szNoticeMsg), (unsigned short*)szTempMsg, sizeof(szTempMsg) );
memcpy(pNotice->szNoticeMessage, szTempMsg, sizeof(pNotice->szNoticeMessage));
pNotice->szNoticeMessage[254]=0;
pNotice->szNoticeMessage[255]=0;
wsprintf(pNotice->Notice, szNoticeMsg);
PHeadSetB(&pNotice->PacketHeader, 0x0D, wcslen((unsigned short *)pNotice->szNoticeMessage)*2+ 0x12);
#else
wsprintf(pNotice->Notice, szNoticeMsg);
PHeadSetB((LPBYTE)pNotice, 0x0D, strlen(pNotice->Notice) + sizeof(PMSG_NOTICE) - sizeof(pNotice->Notice) + 1 );
#endif
}

Похожие темы (5)