Exemplo n.º 1
0
void ListServer_Connect()
{
	if ( serverRunning == false ) return;
	if ( setSock == false )
	{
		setSock = true;
		listServer.setDescription( "listserver" );
		listServer.setProtocol( SOCKET_PROTOCOL_TCP );
		listServer.setType( SOCKET_TYPE_CLIENT );
		listServer.setOptions( SOCKET_OPTION_NONBLOCKING );
	}
	CString ip(findKey("listip")), port(findKey("listport"));
	listServer.init( ip, port );
	int val = listServer.connect();
	if (val == 0 || val == SOCKET_ALREADY_CONNECTED) lsConnected = true;
	else lsConnected = false;
	if ( !lsConnected )
	{
		errorOut("errorlog.txt", CBuffer() << "Unable to connect to list server.", true);
		listServer.disconnect();
		return;
	}

	errorOut("serverlog.txt", CBuffer() << "Connected to the list server successfully.", true);

	// Send the ServerHQ password.
	CPacket pack;
	pack << (char)SLSSERVERHQPASS << serverhq_pass << "\n";

	// assemble server packet.
	pack << (char)SLSNEWSERVER << (char)listServerFields[0].length() << listServerFields[0];
	pack << (char)listServerFields[1].length() << listServerFields[1];
	pack << (char)listServerFields[2].length() << listServerFields[2];
	pack << (char)listServerFields[3].length() << listServerFields[3];
	pack << (char)listServerFields[4].length() << listServerFields[4];
	pack << (char)listServerFields[5].length() << listServerFields[5];
	pack << (char)serverPort.length() << serverPort;
	if (localip == CString("AUTO"))
	{
		CString slocalip(listServer.getLocalIp());
		if (slocalip == CString("127.0.1.1") || slocalip == CString("127.0.0.1"))
		{
			errorOut("serverlog.txt", CBuffer() << "[WARNING] Socket returned " << slocalip << " for its local ip!  Not sending local ip to serverlist.", true);
			pack << (char)0;
		}
		else pack << (char)slocalip.length() << slocalip;
	}
	else pack << (char)localip.length() << localip;
	pack << "\n";

	// Send the ServerHQ level.
	pack << (char)SLSSERVERHQLEVEL << (char)serverhq_level << "\n";

	// send gserver info to listserver
	ListServer_Send(pack);

	// send players to listserver
	CPacket pPacket;
	for (int i = 0; i < playerList.count(); i++)
	{
		CPlayer *player = (CPlayer *)playerList[i];
		pPacket << (char)player->accountName.length() << player->accountName << player->getProp(NICKNAME) << player->getProp(CURLEVEL) << player->getProp(PLAYERX) << player->getProp(PLAYERY) << player->getProp(PALIGNMENT) << (char)(1 << player->type);
	}

	ListServer_Send(CPacket() << (char)SLSCOUNT << (char)playerList.count() << pPacket << "\n");
}