Start.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <csignal>
  2. #include <cstdlib>
  3. #include <Datei.h>
  4. #include <fstream>
  5. #include <Globals.h>
  6. #include <iostream>
  7. #include <Klient.h>
  8. #ifndef _WINDOWS
  9. #include <sys/resource.h>
  10. #endif
  11. #include <Text.h>
  12. #include <Zeit.h>
  13. #include <AsynchronCall.h>
  14. #include "Server.h"
  15. #include "ChunkMap.h"
  16. FactoryCraftServer* mserver = 0;
  17. void exit()
  18. {
  19. if (mserver)
  20. {
  21. std::cout << "The server terminated unexpectedly. Trying to save game progress.\n";
  22. mserver->close();
  23. }
  24. }
  25. class DuplicatingStreamBuf : public std::stringbuf
  26. {
  27. private:
  28. std::ostream& m_os1;
  29. std::ostream& m_os2;
  30. Critical cs;
  31. public:
  32. DuplicatingStreamBuf(std::ostream& os1, std::ostream& os2)
  33. : std::stringbuf(),
  34. m_os1(os1),
  35. m_os2(os2)
  36. {}
  37. int sync() override
  38. {
  39. cs.lock();
  40. m_os1 << str();
  41. m_os2 << str();
  42. str("");
  43. cs.unlock();
  44. }
  45. };
  46. int main()
  47. {
  48. Framework::initFramework();
  49. initializeBlockTypes();
  50. initializeItemTypes();
  51. initializeEntityTypes();
  52. initializeDimensions();
  53. initializeMultiblockTypes();
  54. #ifndef _WINDOWS
  55. struct rlimit core_limits;
  56. core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
  57. setrlimit(RLIMIT_CORE, &core_limits);
  58. #endif
  59. Zeit* z = getZeit();
  60. Text* pfad = new Text("log/");
  61. pfad->append(z->getZeit("y-m-d_h-i-s.log"));
  62. z->release();
  63. DateiPfadErstellen(pfad->getText());
  64. std::ofstream file;
  65. file.open(pfad->getText());
  66. std::streambuf* sbuf = std::cout.rdbuf();
  67. #ifndef _DEBUG
  68. std::ostream newCout(sbuf);
  69. DuplicatingStreamBuf duplicator(file, newCout);
  70. std::cout.rdbuf(&duplicator);
  71. #endif
  72. pfad->release();
  73. std::cout << "Starting...\n";
  74. std::cout << "Loading config file fcInit.ini ...\n";
  75. InitDatei* dat = new InitDatei("fcInit.ini");
  76. if (!dat->laden())
  77. {
  78. std::cout << "error: Datei konnte nicht gelesen werden. Das Programm "
  79. "wird geschlossen.\n";
  80. dat->release();
  81. file.close();
  82. std::cout.rdbuf(sbuf);
  83. exit(1);
  84. }
  85. const char* wichtig[]
  86. = {"SSLPort", "SSLCert", "SSLKey", "SSLPasswort", "Port"};
  87. for (const char* w : wichtig)
  88. {
  89. if (!dat->wertExistiert(w))
  90. {
  91. std::cout
  92. << "error: The value '" << w
  93. << "' was not specified. The Server can not start.\n";
  94. dat->release();
  95. file.close();
  96. std::cout.rdbuf(sbuf);
  97. exit(1);
  98. }
  99. }
  100. mserver = new FactoryCraftServer(dat);
  101. std::atexit(exit);
  102. signal(SIGTERM, exit);
  103. signal(SIGSEGV, exit);
  104. signal(SIGILL, exit);
  105. signal(SIGABRT, exit);
  106. signal(SIGFPE, exit);
  107. signal(SIGINT, exit);
  108. new Framework::AsynchronCall("Commander", []() {
  109. while (mserver)
  110. {
  111. std::string line;
  112. std::getline(std::cin, line);
  113. if (!mserver) return;
  114. if (Text(line.c_str()) == Text("exit"))
  115. {
  116. std::cout << "The server will be terminated and the game progress will be saved.\n";
  117. mserver->close();
  118. return;
  119. }
  120. else if (Game::INSTANCE)
  121. {
  122. Game::INSTANCE->zChat()->zCommandExecutor()->execute(
  123. line.c_str(), 0);
  124. }
  125. }
  126. });
  127. std::cout << "The Server is now running.\n";
  128. mserver->run();
  129. mserver->release();
  130. mserver = 0;
  131. if (Game::INSTANCE)
  132. {
  133. Game::INSTANCE->warteAufThread(100000000);
  134. Game::INSTANCE->release();
  135. Game::INSTANCE = 0;
  136. }
  137. dat->release();
  138. std::cout << "The server was shut down successfully.\n";
  139. file.close();
  140. std::cout.rdbuf(sbuf);
  141. Framework::releaseFramework();
  142. return 0;
  143. }