LevelDatabaseUploadThread::LevelDatabaseUploadThread(ClientGame* game) { mGame = game; errorNumber = 0; EditorUserInterface* editor = mGame->getUIManager()->getUI<EditorUserInterface>(); editor->lockQuit("CAN'T QUIT WHILE UPLOADING"); if(mGame->getLevelDatabaseId()) editor->queueSetLingeringMessage("Updating Level in Pleiades [[SPINNER]]"); else editor->queueSetLingeringMessage("Uploading New Level to Pleiades [[SPINNER]]"); string fileData; readFile(joindir(mGame->getSettings()->getFolderManager()->getScreenshotDir(), UploadScreenshotFilename + string(".png")), fileData); username = mGame->getPlayerName(); user_password = mGame->getPlayerPassword(); content = editor->getLevelText(); screenshot = UploadScreenshotFilename + string(".png"); screenshot2 = fileData; string levelgenFilename; levelgenFilename = mGame->getScriptName(); if(levelgenFilename != "") readFile(mGame->getSettings()->getFolderManager()->findLevelGenScript(levelgenFilename), levelgen); uploadrequest = HttpRequest::LevelDatabaseBaseUrl + UploadRequest; }
// Constructor LevelDatabaseDownloadThread::LevelDatabaseDownloadThread(const string &levelId, ClientGame *game) : mLevelId(levelId), mGame(game) { errorNumber = 0; levelFileName = "db_" + mLevelId + ".level"; FolderManager *fm = mGame->getSettings()->getFolderManager(); levelDir = fm->getLevelDir(); string filePath = joindir(levelDir, levelFileName); if(fileExists(filePath)) { // Check if file is on our delete list... if so, we can clobber it. But we also need to remove it from the skiplist. if(mGame->getSettings()->isLevelOnSkipList(levelFileName)) mGame->getSettings()->removeLevelFromSkipList(levelFileName); else // File exists and is not on the skip list... show an error message { mGame->displayErrorMessage("!!! Already have a file called %s on the server. Download aborted.", filePath.c_str()); errorNumber = 100; return; } } mGame->displaySuccessMessage("Downloading %s", mLevelId.c_str()); }
void LevelDatabaseDownloadThread::finish() { if(errorNumber == 100) return; if(errorNumber == 2) { mGame->displayErrorMessage("!!! Downloaded level without levelgen"); return; } if(errorNumber != 0) { mGame->displayErrorMessage("%s", url); return; } mGame->displaySuccessMessage("Saved to %s", levelFileName.c_str()); if(levelGenFileName.length() != 0) mGame->displaySuccessMessage("Saved to %s", levelGenFileName.c_str()); ServerGame *serverGame = mGame->getServerGame(); if(serverGame) { string filePath = joindir(levelDir, levelFileName); LevelInfo levelInfo; levelInfo.filename = levelFileName; levelInfo.folder = levelDir; serverGame->addDownloadedLevel(filePath, levelInfo); } }
// Thanks to the good developers of naev for excellent code to base this off of. // Much was copied directly. void ScreenShooter::saveScreenshot(UIManager *uiManager, GameSettings *settings, string filename) { string folder = settings->getFolderManager()->getScreenshotDir(); // Let's find a filename to use makeSureFolderExists(folder); string fullFilename; S32 ctr = 0; if(filename == "") { while(true) // Settle in for the long haul, boys. This seems crazy... { fullFilename = joindir(folder, "screenshot_" + itos(ctr++) + ".png"); if(!fileExists(fullFilename)) break; } } else fullFilename = joindir(folder, filename + ".png"); // We default to resizing the opengl viewport to the standard canvas size, unless we're // in the editor or our window is smaller than the canvas size bool doResize = (!uiManager->isCurrentUI<EditorUserInterface>()) && DisplayManager::getScreenInfo()->getWindowWidth() > DisplayManager::getScreenInfo()->getGameCanvasWidth(); // Change opengl viewport temporarily to have consistent screenshot sizes if(doResize) resizeViewportToCanvas(uiManager); // Now let's grab them pixels S32 width; S32 height; // If we're resizing, use the default canvas size if(doResize) { width = DisplayManager::getScreenInfo()->getGameCanvasWidth(); height = DisplayManager::getScreenInfo()->getGameCanvasHeight(); } // Otherwise just take the window size else { width = DisplayManager::getScreenInfo()->getWindowWidth(); height = DisplayManager::getScreenInfo()->getWindowHeight(); } // Allocate buffer GLubyte == U8 U8 *screenBuffer = new U8[BytesPerPixel * width * height]; // Glubyte * 3 = 24 bits png_bytep *rows = new png_bytep[height]; // Set alignment at smallest for compatibility mGL->glPixelStore(GLOPT::PackAlignment, 1); // Grab the front buffer with the new viewport #ifndef BF_USE_GLES // GLES doesn't need this? mGL->glReadBuffer(GLOPT::Back); #endif // Read pixels from buffer - slow operation mGL->glReadPixels(0, 0, width, height, GLOPT::Rgb, GLOPT::UnsignedByte, screenBuffer); // Change opengl viewport back to what it was if(doResize) restoreViewportToWindow(settings); // Convert Data for (S32 i = 0; i < height; i++) rows[i] = &screenBuffer[(height - i - 1) * (BytesPerPixel * width)]; // Backwards! // Write the PNG! if(!writePNG(fullFilename.c_str(), rows, width, height, PNG_COLOR_TYPE_RGB, BitDepth)) logprintf(LogConsumer::LogError, "Creating screenshot failed!!"); // Clean up delete [] rows; delete [] screenBuffer; }
void LevelDatabaseDownloadThread::run() { if(errorNumber == 100) return; dSprintf(url, UrlLength, (HttpRequest::LevelDatabaseBaseUrl + LevelRequest).c_str(), mLevelId.c_str()); HttpRequest req(url); if(!req.send()) { dSprintf(url, UrlLength, "!!! Error connecting to server"); errorNumber = 1; return; } if(req.getResponseCode() != HttpRequest::OK) { dSprintf(url, UrlLength, "!!! Server returned an error: %d", req.getResponseCode()); errorNumber = 1; return; } string levelCode = req.getResponseBody(); string filePath = joindir(levelDir, levelFileName); if(writeFile(filePath, levelCode)) { // Success } else // File writing went bad { dSprintf(url, UrlLength, "!!! Could not write to %s", levelFileName.c_str()); errorNumber = 1; return; } dSprintf(url, UrlLength, (HttpRequest::LevelDatabaseBaseUrl + LevelgenRequest).c_str(), mLevelId.c_str()); req = HttpRequest(url); if(!req.send()) { dSprintf(url, UrlLength, "!!! Error connecting to server", levelFileName.c_str()); errorNumber = 2; return; } if(req.getResponseCode() != HttpRequest::OK) { dSprintf(url, UrlLength, "!!! Server returned an error: %d", req.getResponseCode()); errorNumber = 2; return; } string levelgenCode = req.getResponseBody(); // no data is sent if the level has no levelgen if(levelgenCode.length() > 0) { // the leveldb prepends a lua comment with the target filename, and here we parse it int startIndex = 3; // the length of "-- " int breakIndex = levelgenCode.find_first_of("\r\n"); string levelgenFileName = levelgenCode.substr(startIndex, breakIndex - startIndex); // trim the filename line before writing levelgenCode = levelgenCode.substr(breakIndex + 2, levelgenCode.length()); filePath = joindir(levelDir, levelgenFileName); if(writeFile(filePath, levelgenCode)) { // Success } else { dSprintf(url, UrlLength, "!!! Server returned an error: %d", req.getResponseCode()); errorNumber = 2; return; } } }