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 }
void ListServer_End() { if ( listServerFields[5] == "localhost" ) return; if (!lsConnected) return; listServer.disconnect(); }
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)); }
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"); }