Exemplo n.º 1
0
void shutdownServer( int signal )
{
	if(hasShutdown)
		return;
	hasShutdown = true;
	serverRunning = false;
	serverSock.disconnect();
	saveWeapons("weapons.txt");
	serverFlags.save("serverflags.txt");
	for(int i = playerList.count()-1; i >= 0; i--)
		delete ((CPlayer*)playerList[i]);

	if(lsConnected)
		ListServer_End();

	for(int i = 0; i < levelList.count(); i++)
	{
		CLevel* level = (CLevel*)levelList[i];
		level->saveNpcs();
		delete level;
	}

	for(int i = 0; i < CMap::mapList.count(); i++)
		delete((CMap*)CMap::mapList[i]);

	for(int i = 0; i < weaponList.count(); i++)
		delete ((CWeapon*)weaponList[i]);

	errorOut("serverlog.txt", "Server shutdown.");

	#ifdef PSPSDK
		sceKernelExitGame();
	#endif
}
Exemplo n.º 2
0
void ListServer_End()
{
	if ( listServerFields[5] == "localhost" ) return;
	if (!lsConnected) return;

	listServer.disconnect();
}
Exemplo n.º 3
0
void acceptSock(CSocket& pSocket, int pType)
{
	CSocket* newSock = pSocket.accept();
	if (newSock == 0)
		return;

	// Server ip bans.
	if (pType == SOCK_SERVER)
	{
		CString ip(newSock->getRemoteIp());
		for (std::vector<CString>::const_iterator i = ipBans.begin(); i != ipBans.end(); ++i)
		{
			if (ip.match(*i))
			{
				printf("Rejected server: %s matched ip ban %s\n", ip.text(), i->text());
				newSock->disconnect();
				delete newSock;
				return;
			}
		}
	}

	//newSock->setOptions( SOCKET_OPTION_NONBLOCKING );
	serverlog.out(CString() << "New Connection: " << CString(newSock->getRemoteIp()) << " -> " << ((pType == SOCK_PLAYER) ? "Player" : "Server") << "\n");
	if (pType == SOCK_PLAYER || pType == SOCK_PLAYEROLD)
		playerList.push_back(new TPlayer(newSock, (pType == SOCK_PLAYEROLD ? true : false)));
	else serverList.push_back(new TServer(newSock));
}
Exemplo n.º 4
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");
}