示例#1
0
/** Recursively send the server tree.
 * This is used during network burst to inform the other server
 * (and any of ITS servers too) of what servers we know about.
 * If at any point any of these servers already exist on the other
 * end, our connection may be terminated.
 * The hopcount parameter (3rd) is deprecated, and is always 0.
 */
void TreeSocket::SendServers(TreeServer* Current, TreeServer* s)
{
	SendServerInfo(Current);

	const TreeServer::ChildServers& children = Current->GetChildren();
	for (TreeServer::ChildServers::const_iterator i = children.begin(); i != children.end(); ++i)
	{
		TreeServer* recursive_server = *i;
		if (recursive_server != s)
		{
			this->WriteLine(CommandServer::Builder(recursive_server));
			/* down to next level */
			this->SendServers(recursive_server, s);
		}
	}
}
示例#2
0
static int Run()
{
	int64 NextHeartBeat = 0;
	NETADDR BindAddr = {NETTYPE_IPV4, {0},0};

	if(!pNet->Open(BindAddr, 0, 0, 0, 0))
		return 0;

	while(1)
	{
		CNetChunk p;
		pNet->Update();
		while(pNet->Recv(&p))
		{
			if(p.m_ClientID == -1)
			{
				if(p.m_DataSize == sizeof(SERVERBROWSE_GETINFO) &&
					mem_comp(p.m_pData, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)) == 0)
				{
					SendServerInfo(&p.m_Address);
				}
				else if(p.m_DataSize == sizeof(SERVERBROWSE_FWCHECK) &&
					mem_comp(p.m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0)
				{
					SendFWCheckResponse(&p.m_Address);
				}
			}
		}

		/* send heartbeats if needed */
		if(NextHeartBeat < time_get())
		{
			NextHeartBeat = time_get()+time_freq()*(15+(rand()%15));
			SendHeartBeats();
		}

		thread_sleep(100);
	}
}
示例#3
0
void GameSocket::ProcessData(unsigned char* data, int size)
{
    Reader.SetBuffer(data);

    int offset = 0;
    while(offset < size)
    {
        unsigned short psize  = Reader.ReadWord() + 6;
        unsigned short opcode = Reader.ReadWord();
        Reader.Skip(2);

        switch(opcode) {

        case GAME_CLIENT_KEEP_ALIVE:
        case GAME_CLIENT_ACCEPT_HANDSHAKE:
            break;

        case GAME_CLIENT_INFO:
            SendServerInfo();
            break;

        case GAME_CLIENT_PATCH_REQUEST:
            SendPatchInfo();
            break;

        case GAME_CLIENT_AUTH:
            OnAuth();
            break;

        case GAME_CLIENT_CHARACTER:
            OnCharacter();
            break;

        case GAME_CLIENT_INGAME_REQUEST:
            OnIngameRequest();
            break;

        case GAME_CLIENT_MOVEMENT:
            OnMovement();
            break;

        case GAME_CLIENT_CLOSE:
            OnGameQuit();
            break;

        case GAME_CLIENT_CHAT:
            OnChat();
            break;

        case GAME_CLIENT_ITEM_MOVE:
            OnItem();
            break;

        case GAME_CLIENT_TARGET:
            OnTarget();
            break;

        case GAME_CLIENT_INGAME_NOTIFY:
            OnIngameNotify();
            break;

        case GAME_CLIENT_EMOTION://update carlosx
            OnEmotion();
            break;

        case GAME_CLIENT_SIT: //update carlosx
            OnSit();
            break;

        case GAME_CLIENT_ESTRELLA: //update carlosx
            OnEstrella();
            break;

        case GAME_CLIENT_ADDSKILL: //update carlosx
            OnUpdateSkill();
            break;

        case GAME_CLIENT_MASTERY: //update carlosx
            OnMastertSkill();
            break;

        case GAME_CLIENT_ATSKILL: //update carlosx
            OnATSkill();
            break;

        case GAME_CLIENT_ADDSTR:  //update carlosx
            OnADDStr();
            break;

        case GAME_CLIENT_ADDINT:  //update carlosx
            OnADDInt();
            break;

        case GAME_CLIENT_GM:
            OnGM();
            break;

        default:
            printf("Unknown opcode: %.4x\n", opcode);
        }
        Reader.Reset();
        Reader.Skip(psize);
        offset += psize;
    }
    Reader.Reset();
}