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);
   }
}
Пример #4
0
// 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;
      }
   }
}