4h of work

This commit is contained in:
Anonymous275
2020-04-12 01:14:16 +03:00
parent e60790e185
commit 9a47f651fc
11 changed files with 548 additions and 342 deletions
+12 -11
View File
@@ -1,12 +1,13 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
project(BeamMP-Server) project(BeamMP-Server)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
include_directories(${PROJECT_SOURCE_DIR}/curl) include_directories(${PROJECT_SOURCE_DIR}/curl)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
add_executable(BeamMP-Server src/main.cpp src/http.cpp src/logger.cpp src/config.cpp src/Network/Server.cpp add_executable(BeamMP-Server src/main.cpp src/http.cpp src/logger.cpp src/config.cpp src/Network/Server.cpp
src/Network/enet.h src/Network/DataParser.cpp src/heartbeat.cpp src/Network/enet.h src/Network/DataParser.cpp src/heartbeat.cpp
src/Network/ClientHandler.cpp src/Network/functions.cpp src/Settings.hpp) src/Network/ClientHandler.cpp src/Network/functions.cpp src/Settings.hpp
src/Resources.cpp src/Network/TCPClientHandler.cpp)
target_link_libraries(BeamMP-Server winmm ws2_32 libcurl_a) target_link_libraries(BeamMP-Server winmm ws2_32 libcurl_a)
+62
View File
@@ -8,6 +8,7 @@
#include <cstdio> #include <cstdio>
#include "../logger.h" #include "../logger.h"
void ParseData(ENetPacket*packet,ENetPeer*peer); //Data Parser void ParseData(ENetPacket*packet,ENetPeer*peer); //Data Parser
void OnConnect(ENetPeer*peer); void OnConnect(ENetPeer*peer);
@@ -82,3 +83,64 @@ void ServerMain(int Port, int MaxClients) {
enet_deinitialize(); enet_deinitialize();
return; return;
} }
void CreateNewThread(void*);
void TCPMain(int Port){
info("Starting TCP Server on port " + to_string(Port));
WSADATA wsaData;
int iResult;
sockaddr_in addr{};
SOCKET sock,client;
addr.sin_family = AF_INET;
addr.sin_port = htons(Port);
iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if(iResult)
{
printf("WSA startup failed");
return;
}
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock == INVALID_SOCKET)
{
printf("Invalid socket");
return;
}
iResult = bind(sock,(sockaddr*)&addr,sizeof(sockaddr_in ));
if(iResult)
{
printf("bind failed %lu",GetLastError());
return;
}
iResult = listen(sock,SOMAXCONN);
if(iResult)
{
printf("iResult failed %lu",GetLastError());
return;
}
while(client = accept(sock,nullptr,nullptr))
{
if(client == INVALID_SOCKET)
{
printf("invalid client socket\n");
continue;
}
CreateNewThread((void*)&client);
}
}
+118
View File
@@ -0,0 +1,118 @@
///
/// Created by Anonymous275 on 4/11/2020
///
#include <thread>
#include <string>
#include <fstream>
#include <iostream>
#include <WinSock2.h>
#include "../Settings.hpp"
int ParseAndSend(SOCKET Client, std::string Data){
std::string Response, Packet;
char ID = Data.at(0);
int Prev = 0,DataSent = 0, Size = 0;
bool FileSent = true;
switch (ID){
case 'a' :
Response = FileList;
break;
case 'b' :
FileSent = false;
break;
}
std::string FLocation = Data.substr(1);
if(FileList.find(FLocation) == std::string::npos)return -1;
do {
if(!FileSent){
std::ifstream f;
f.open(FLocation.c_str(), std::ios::binary);
if(f.good()){
if(!Size){
Size = f.seekg(0, std::ios_base::end).tellg();
Response.resize(Size);
f.seekg(0, std::ios_base::beg);
f.read(&Response[0], Size);
f.close();
}else{f.close();}
if(DataSent != Size){
if((Size-DataSent) < 65535){
Packet = Response.substr(Prev,(Size-DataSent));
DataSent += (Size-DataSent);
Response.clear();
}else{
DataSent += 65535;
Packet = Response.substr(Prev,65535);
}
Prev = DataSent;
}else{
Size = DataSent = Prev = 0;
Response = "End of file";
FileSent = true;
Packet.clear();
}
}else{
FileSent = true;
Response = "Cannot Open File " + FLocation;
}
}
int iSendResult;
if(!Packet.empty())iSendResult = send(Client, Packet.c_str(), Packet.length(), 0);
else iSendResult = send(Client, Response.c_str(), Response.length(), 0);
if (iSendResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(Client);
return -1;
}
}while(!FileSent);
return 0;
}
void Client(void* ClientData){
SOCKET Client = *(SOCKET*)ClientData;
printf("Client connected\n");
int iResult, iSendResult;
char recvbuf[65535];
int recvbuflen = 65535;
do {
iResult = recv(Client, recvbuf, recvbuflen, 0);
if (iResult > 0) {
//printf("Bytes received: %d\n", iResult);
std::string Data = recvbuf,Response;
Data.resize(iResult);
if(ParseAndSend(Client,Data) == -1)break;
// Echo the buffer back to the sender
/*iSendResult = send(Client, Response.c_str(), Response.length(), 0);
if (iSendResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(Client);
return;
}
printf("Bytes sent: %d\n", iSendResult);*/
}
else if (iResult == 0)
printf("Connection closing...\n");
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(Client);
break;
}
} while (iResult > 0);
std::cout << "Client Closed" << std::endl;
}
void CreateNewThread(void* ClientData){
std::cout << "New Client" << std::endl;
std::thread NewClient(Client,ClientData);
NewClient.detach();
}
+22
View File
@@ -0,0 +1,22 @@
///
/// Created by Anonymous275 on 4/11/2020
///
#include <iostream>
#include <algorithm>
#include <filesystem>
namespace fs = std::experimental::filesystem;
std::string FileList;
void HandleResources(const std::string& path){
struct stat info{};
if(stat( "Resources", &info) != 0){
_wmkdir(L"Resources");
}
for (const auto & entry : fs::directory_iterator(path)){
FileList += entry.path().string() + ";";
}
std::replace(FileList.begin(),FileList.end(),'\\','/');
}
+3 -2
View File
@@ -1,13 +1,14 @@
/// ///
/// Created by Anonymous275 on 4/10/2020 /// Created by Anonymous275 on 4/10/2020
/// ///
extern std::string MapName;
extern bool Private; extern bool Private;
extern int MaxPlayers; extern int MaxPlayers;
extern int UDPPort; extern int UDPPort;
extern int TCPPort; extern int TCPPort;
extern int PlayerCount;
extern std::string MapName;
extern std::string ServerName; extern std::string ServerName;
extern std::string Resource; extern std::string Resource;
extern std::string ServerVersion; extern std::string ServerVersion;
extern std::string ClientVersion; extern std::string ClientVersion;
extern int PlayerCount; extern std::string FileList;
+123 -124
View File
@@ -1,125 +1,124 @@
/// ///
/// Created by Anonymous275 on 1/28/2020 /// Created by Anonymous275 on 1/28/2020
/// ///
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include "logger.h" #include "logger.h"
using namespace std; //nameSpace STD using namespace std; //nameSpace STD
void GenerateConfig(); void GenerateConfig();
string RemoveComments(const string& Line); string RemoveComments(const string& Line);
string convertToString(char* a, int size); string convertToString(char* a, int size);
void SetValues(const string& Line, int Index); void SetValues(const string& Line, int Index);
void SetMainValues(bool,int,int,string,string,string); void SetMainValues(bool,int,int,int,string,string,string);
bool D; bool D;
int P; int P,FP,MP;
int MP; string M,S,F;
string M;
string S; //Generates or Reads Config
string F; void ParseConfig(){
ifstream InFileStream;
InFileStream.open("Server.cfg");
//Generates or Reads Config if(InFileStream.good()){ //Checks if Config Exists
void ParseConfig(){ info("Config Found Updating Values");
ifstream InFileStream; string line;
InFileStream.open("Server.cfg"); int index = 1;
if(InFileStream.good()){ //Checks if Config Exists while (getline(InFileStream, line)) {
info("Config Found Updating Values"); if(line.rfind('#', 0) != 0){ //Checks if it starts as Comment
string line; string CleanLine = RemoveComments(line); //Cleans it from the Comments
int index = 1; SetValues(CleanLine,index); //sets the values
while (getline(InFileStream, line)) { index++;
if(line.rfind('#', 0) != 0){ //Checks if it starts as Comment }
string CleanLine = RemoveComments(line); //Cleans it from the Comments }
SetValues(CleanLine,index); //sets the values SetMainValues(D,P,FP,MP,M,S,F); //gives the values to Main
index++; }else{
} info("Config Not Found Generating A new One");
} GenerateConfig();
SetMainValues(D,P,MP,M,S,F); //gives the values to Main }
}else{ InFileStream.close();
info("Config Not Found Generating A new One"); }
GenerateConfig();
}
InFileStream.close();
} void SetValues(const string& Line, int Index) {
int i = 0, state = 0;
char Data[50] = "";
bool Switch = false;
void SetValues(const string& Line, int Index) { if (Index > 4) { Switch = true; }
int i = 0, state = 0; for (char c : Line) {
char Data[50] = ""; if (Switch) {
bool Switch = false; if (c == '\"') { state++; }
if (Index > 3) { Switch = true; } if (state > 0 && state < 2) {
for (char c : Line) { Data[i] = c;
if (Switch) { i++;
if (c == '\"') { state++; } }
if (state > 0 && state < 2) { } else {
Data[i] = c; if (c == ' ') { state++; }
i++; if (state > 1) {
} Data[i] = c;
} else { i++;
if (c == ' ') { state++; } }
if (state > 1) { }
Data[i] = c; }
i++; for (int C = 1; C <= i; C++){
} Data[C-1] = Data[C];
} }
} string::size_type sz;
for (int C = 1; C <= i; C++){ bool Boolean = (convertToString(Data,i-1).find("true") != string::npos);//searches for "true"
Data[C-1] = Data[C]; switch (Index){
} case 1 :
string::size_type sz; D = Boolean;//checks and sets the Debug Value
bool Boolean = (convertToString(Data,i-1).find("true") != string::npos);//searches for "true" break;
switch (Index){ case 2 : P = stoi(Data, &sz);//sets the Port
case 1 : break;
D = Boolean;//checks and sets the Debug Value case 3 : FP = stoi(Data, &sz);//sets the TCP File Port
break; break;
case 2 : P = stoi(Data, &sz);//sets the Port case 4 : MP = stoi(Data, &sz); //sets the Max Amount of player
break; break;
case 3 : MP = stoi(Data, &sz);//sets the Max Amount of player case 5 : M = Data; //Map
break; break;
case 4 : M = Data; //Map case 6 : S = Data; //Name
break; case 7 : F = Data; //File name
case 5 : S = Data; //Name }
case 6 : F = Data; //File name }
}
}
//generates default Config
void GenerateConfig(){
//generates default Config ofstream FileStream;
void GenerateConfig(){ FileStream.open ("Server.cfg");
ofstream FileStream; FileStream << "# This is the BeamMP Server Configuration File\n"
FileStream.open ("Server.cfg"); "Debug = false # true or false to enable debug console output\n"
FileStream << "# This is the BeamNG-MP Server Configuration File\n" "Port = 30814 # Port to run the server on\n"
"Debug = false # true or false to enable debug console output\n" "FilePort = 30814 # Port to transfer Files\n"
"Port = 30814 # Port to run the server on\n" "MaxPlayers = 10 # Maximum Amount of Clients\n"
"MaxPlayers = 10 # Maximum Amount of Clients\n" "Map = \"/levels/gridmap/info.json\" # Default Map\n"
"Map = \"levels/gridmap/level.json\"\n" "Name = \"BeamMP New Server\" # Server Name\n"
"Name = \"BeamNG-MP FTW\"\n" "use = \"Resources\" # Resource file name";
"use = \"/Resources\""; FileStream.close();
FileStream.close(); }
}
string RemoveComments(const string& Line){
string RemoveComments(const string& Line){ int i = 0;
int i = 0; char Data[50] = "";
char Data[50] = ""; for(char c : Line) {
for(char c : Line) { if(c == '#'){break;} //when it finds the # it will stop
if(c == '#'){break;} //when it finds the # it will stop Data[i] = c;
Data[i] = c; i++;
i++; }
} return convertToString(Data,i); //Converts it from a char array to string and returns it
return convertToString(Data,i); //Converts it from a char array to string and returns it }
}
//Converts a char array or pointer to string
//Converts a char array or pointer to string string convertToString(char* a, int size)
string convertToString(char* a, int size) {
{ int i;
int i; string s;
string s; for (i = 0; i < size; i++) {
for (i = 0; i < size; i++) { s = s + a[i];
s = s + a[i]; }
} return s;
return s;
} }
-2
View File
@@ -17,13 +17,11 @@ void PostHTTP(const std::string& IP,const std::string& Fields);
void Heartbeat() void Heartbeat()
{ {
string UUID = HTTP_REQUEST("https://beamng-mp.com/new-server-startup",443); string UUID = HTTP_REQUEST("https://beamng-mp.com/new-server-startup",443);
std::cout << "UUID GEN : " << UUID << std::endl;
std::string State = Private ? "true" : "false"; std::string State = Private ? "true" : "false";
while(true) while(true)
{ {
PostHTTP("https://beamng-mp.com/heartbeat","uuid="+UUID+"&players="+to_string(PlayerCount)+"&maxplayers="+to_string(MaxPlayers)+"&port=" PostHTTP("https://beamng-mp.com/heartbeat","uuid="+UUID+"&players="+to_string(PlayerCount)+"&maxplayers="+to_string(MaxPlayers)+"&port="
+ to_string(UDPPort) + "&map=" + MapName + "&private="+State+"&serverversion="+ServerVersion+"&clientversion="+ClientVersion+"&name="+ServerName); + to_string(UDPPort) + "&map=" + MapName + "&private="+State+"&serverversion="+ServerVersion+"&clientversion="+ClientVersion+"&name="+ServerName);
std::this_thread::sleep_for (std::chrono::seconds(5)); std::this_thread::sleep_for (std::chrono::seconds(5));
} }
} }
+1 -1
View File
@@ -8,6 +8,7 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{ {
((std::string*)userp)->append((char*)contents, size * nmemb); ((std::string*)userp)->append((char*)contents, size * nmemb);
@@ -44,5 +45,4 @@ void PostHTTP(const std::string& IP,const std::string& Fields){
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
} }
std::cout << "Buffer : " << readBuffer << std::endl;
} }
+112 -112
View File
@@ -1,113 +1,113 @@
/// ///
/// Created by jojos38 on 28/01/2020 /// Created by jojos38 on 28/01/2020
/// ///
#include <fstream> #include <fstream>
#include "logger.h" #include "logger.h"
#include <string> #include <string>
void addToLog(basic_string<char> Data); void addToLog(basic_string<char> Data);
using namespace std; using namespace std;
int loggerlevel; int loggerlevel;
void setLoggerLevel(char level_string[]) { void setLoggerLevel(char level_string[]) {
if (!strcmp(level_string, "ALL")) if (!strcmp(level_string, "ALL"))
loggerlevel = 0; loggerlevel = 0;
if (!strcmp(level_string, "DEBUG")) if (!strcmp(level_string, "DEBUG"))
loggerlevel = 1; loggerlevel = 1;
if (!strcmp(level_string, "INFO")) if (!strcmp(level_string, "INFO"))
loggerlevel = 2; loggerlevel = 2;
if (!strcmp(level_string, "WARN")) if (!strcmp(level_string, "WARN"))
loggerlevel = 3; loggerlevel = 3;
if (!strcmp(level_string, "ERROR")) if (!strcmp(level_string, "ERROR"))
loggerlevel = 4; loggerlevel = 4;
if (!strcmp(level_string, "OFF")) if (!strcmp(level_string, "OFF"))
loggerlevel = 5; loggerlevel = 5;
} }
stringstream getDate() { stringstream getDate() {
// current date/time based on current system // current date/time based on current system
time_t now = time(nullptr); time_t now = time(nullptr);
tm* ltm = localtime(&now); tm* ltm = localtime(&now);
int month = 1 + ltm->tm_mon; int month = 1 + ltm->tm_mon;
int day = ltm->tm_mday; int day = ltm->tm_mday;
int hours = ltm->tm_hour; int hours = ltm->tm_hour;
int minutes = ltm->tm_min; int minutes = ltm->tm_min;
int seconds = ltm->tm_sec; int seconds = ltm->tm_sec;
string month_string; string month_string;
if (month < 10) month_string = "0" + to_string(month); if (month < 10) month_string = "0" + to_string(month);
else month_string = to_string(month); else month_string = to_string(month);
string day_string; string day_string;
if (day < 10) day_string = "0" + to_string(day); if (day < 10) day_string = "0" + to_string(day);
else day_string = to_string(day); else day_string = to_string(day);
string hours_string; string hours_string;
if (hours < 10) hours_string = "0" + to_string(hours); if (hours < 10) hours_string = "0" + to_string(hours);
else hours_string = to_string(hours); else hours_string = to_string(hours);
string minutes_string; string minutes_string;
if (minutes < 10) minutes_string = "0" + to_string(minutes); if (minutes < 10) minutes_string = "0" + to_string(minutes);
else minutes_string = to_string(minutes); else minutes_string = to_string(minutes);
string seconds_string; string seconds_string;
if (seconds < 10) seconds_string = "0" + to_string(seconds); if (seconds < 10) seconds_string = "0" + to_string(seconds);
else seconds_string = to_string(seconds); else seconds_string = to_string(seconds);
std::stringstream date; std::stringstream date;
date date
<< "[" << "["
<< day_string << "/" << day_string << "/"
<< month_string << "/" << month_string << "/"
<< 1900 + ltm->tm_year << " " << 1900 + ltm->tm_year << " "
<< hours_string << ":" << hours_string << ":"
<< minutes_string << ":" << minutes_string << ":"
<< seconds_string << seconds_string
<< "] "; << "] ";
return date; return date;
} }
void info(const std::string& toPrint) { void info(const std::string& toPrint) {
if (loggerlevel <= 2){ if (loggerlevel <= 2){
cout << getDate().str() << "[INFO] " << toPrint << endl; cout << getDate().str() << "[INFO] " << toPrint << endl;
addToLog(getDate().str() + "[INFO] " + toPrint + "\n"); addToLog(getDate().str() + "[INFO] " + toPrint + "\n");
} }
} }
void error(const std::string& toPrint) { void error(const std::string& toPrint) {
if (loggerlevel <= 4) { if (loggerlevel <= 4) {
cout << getDate().str() << "[ERROR] " << toPrint << endl; cout << getDate().str() << "[ERROR] " << toPrint << endl;
addToLog(getDate().str() + "[ERROR] " + toPrint + "\n"); addToLog(getDate().str() + "[ERROR] " + toPrint + "\n");
} }
} }
void warn(const std::string& toPrint) { void warn(const std::string& toPrint) {
if (loggerlevel <= 3) { if (loggerlevel <= 3) {
cout << getDate().str() << "[WARN] " << toPrint << endl; cout << getDate().str() << "[WARN] " << toPrint << endl;
addToLog(getDate().str() + "[WARN] " + toPrint + "\n"); addToLog(getDate().str() + "[WARN] " + toPrint + "\n");
} }
} }
void debug(const std::string& toPrint) { void debug(const std::string& toPrint) {
if (loggerlevel <= 1) { if (loggerlevel <= 1) {
cout << getDate().str() << "[DEBUG] " << toPrint << endl; cout << getDate().str() << "[DEBUG] " << toPrint << endl;
addToLog(getDate().str() + "[DEBUG] " + toPrint + "\n"); addToLog(getDate().str() + "[DEBUG] " + toPrint + "\n");
} }
} }
+16 -16
View File
@@ -1,16 +1,16 @@
// //
// Created by Anonymous275 on 4/2/2020. // Created by Anonymous275 on 4/2/2020.
// //
#include <iostream> #include <iostream>
#include <ctime> #include <ctime>
#include <sstream> #include <sstream>
#include <string.h> #include <string.h>
using namespace std; using namespace std;
extern int loggerlevel; extern int loggerlevel;
stringstream getDate(); stringstream getDate();
void setLoggerLevel(char level_string[]); void setLoggerLevel(char level_string[]);
void info(const std::string& toPrint); void info(const std::string& toPrint);
void warn(const std::string& toPrint); void warn(const std::string& toPrint);
void error(const std::string& toPrint); void error(const std::string& toPrint);
void debug(const std::string& toPrint); void debug(const std::string& toPrint);
+79 -74
View File
@@ -1,74 +1,79 @@
/// ///
/// Created by Anonymous275 on 28/01/2020 /// Created by Anonymous275 on 28/01/2020
/// ///
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <fstream> #include <fstream>
#include "logger.h" #include "logger.h"
#include <chrono> #include <chrono>
#include <thread> #include <thread>
using namespace std; //nameSpace STD using namespace std;
void DebugData(); void DebugData();
void LogInit(); void LogInit();
void ParseConfig(); void ParseConfig();
void ServerMain(int Port, int MaxClients); void ServerMain(int Port, int MaxClients);
bool Debug = false; bool Debug = false;
void addToLog(basic_string<char> Data); void addToLog(basic_string<char> Data);
void HeartbeatInit(); void HeartbeatInit();
string MapName = "levels/gridmap/level.json"; string MapName = "levels/gridmap/level.json";
bool Private = false; bool Private = false;
int MaxPlayers = 10; int MaxPlayers = 10;
int UDPPort = 30814; int UDPPort = 30814;
int TCPPort = 0; int TCPPort = 30814;
string ServerName = "BeamMP Server"; string ServerName = "BeamMP Server";
string Resource = "/Resources"; string Resource = "Resources";
string ServerVersion = "0.1"; string ServerVersion = "0.1";
string ClientVersion = "0.21"; string ClientVersion = "0.21";
void HandleResources(const std::string& path);
void TCPMain(int Port);
//Entry //Entry
int main() { int main() {
LogInit(); LogInit();
ParseConfig(); ParseConfig();
HeartbeatInit(); HandleResources(Resource);
if(Debug){ //checks if debug is on HeartbeatInit();
DebugData(); //Prints Debug Data if(Debug){ //checks if debug is on
} DebugData(); //Prints Debug Data
setLoggerLevel("ALL"); }
ServerMain(UDPPort, MaxPlayers); setLoggerLevel("ALL");
} std::thread TCPThread(TCPMain,TCPPort);
TCPThread.detach();
ServerMain(UDPPort, MaxPlayers);
void DebugData(){ }
cout << "Debug : true" << "\n";
cout << "Port : " << UDPPort << "\n";
cout << "MaxPlayers : " << MaxPlayers << "\n"; void DebugData(){
cout << "MapName : " << MapName << "\n"; cout << "Debug : true" << endl;
cout << "ServerName : " << ServerName << "\n"; cout << "Port : " << UDPPort << endl;
cout << "File : " << Resource << "\n"; cout << "TCP Port : " << TCPPort << endl;
} cout << "MaxPlayers : " << MaxPlayers << endl;
cout << "MapName : " << MapName << endl;
void SetMainValues(bool D, int P,int MP,string Name,string serverName,string filename){ cout << "ServerName : " << ServerName << endl;
Debug = D; cout << "File : " << Resource << endl;
UDPPort = P; }
MapName = Name;
ServerName = serverName; void SetMainValues(bool D, int P, int FP,int MP,string Name,string serverName,string filename){
MaxPlayers = MP; Debug = D;
Resource = filename; UDPPort = P;
} TCPPort = FP;
MapName = Name;
void LogInit(){ ServerName = serverName;
ofstream LFS; MaxPlayers = MP;
LFS.open ("Server.log"); Resource = filename;
LFS.close(); }
}
void LogInit(){
void addToLog(basic_string<char> Data){ ofstream LFS;
ofstream LFS; LFS.open ("Server.log");
LFS.open ("Server.log", std::ios_base::app); LFS.close();
LFS << Data.c_str(); }
LFS.close();
} void addToLog(basic_string<char> Data){
ofstream LFS;
LFS.open ("Server.log", std::ios_base::app);
LFS << Data.c_str();
LFS.close();
}