mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-26 22:57:00 +02:00
- Integrated the logging API into the server project - Simplified CBasicLogConfigurator usage(exception handling, logging, log file appending)
This commit is contained in:
parent
abf96a5b66
commit
6827fcdb53
@ -260,7 +260,7 @@ int main(int argc, char** argv)
|
|||||||
atexit(dispose);
|
atexit(dispose);
|
||||||
|
|
||||||
CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Client_log2.txt", console);
|
CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Client_log2.txt", console);
|
||||||
logConfig.configureDefault(false);
|
logConfig.configureDefault();
|
||||||
logGlobal->infoStream() <<"Creating console and logfile: "<<pomtime.getDiff();
|
logGlobal->infoStream() <<"Creating console and logfile: "<<pomtime.getDiff();
|
||||||
|
|
||||||
// Init filesystem and settings
|
// Init filesystem and settings
|
||||||
@ -268,15 +268,7 @@ int main(int argc, char** argv)
|
|||||||
settings.init();
|
settings.init();
|
||||||
|
|
||||||
// Initialize logging based on settings
|
// Initialize logging based on settings
|
||||||
try
|
logConfig.configure();
|
||||||
{
|
|
||||||
logConfig.configure();
|
|
||||||
logGlobal->infoStream() << "Initialized logging system successfully.";
|
|
||||||
}
|
|
||||||
catch(const std::exception & e)
|
|
||||||
{
|
|
||||||
std::cout << "Could not initialize the logging system due to configuration error/s. " << e.what() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some basic data validation to produce better error messages in cases of incorrect install
|
// Some basic data validation to produce better error messages in cases of incorrect install
|
||||||
auto testFile = [](std::string filename, std::string message) -> bool
|
auto testFile = [](std::string filename, std::string message) -> bool
|
||||||
|
@ -3,75 +3,86 @@
|
|||||||
|
|
||||||
#include "../CConfigHandler.h"
|
#include "../CConfigHandler.h"
|
||||||
|
|
||||||
CBasicLogConfigurator::CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console) : filePath(filePath), console(console)
|
CBasicLogConfigurator::CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console) : filePath(filePath), console(console), appendToLogFile(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBasicLogConfigurator::configureDefault(bool appendToLogFile /*= true*/)
|
void CBasicLogConfigurator::configureDefault()
|
||||||
{
|
{
|
||||||
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogConsoleTarget>(console));
|
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogConsoleTarget>(console));
|
||||||
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogFileTarget>(filePath, appendToLogFile));
|
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogFileTarget>(filePath, appendToLogFile));
|
||||||
|
appendToLogFile = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBasicLogConfigurator::configure(bool appendToLogFile /*= true*/)
|
void CBasicLogConfigurator::configure()
|
||||||
{
|
{
|
||||||
const JsonNode & loggingNode = settings["logging"];
|
try
|
||||||
if(loggingNode.isNull()) throw std::runtime_error("Settings haven't been loaded.");
|
|
||||||
|
|
||||||
// Configure loggers
|
|
||||||
const JsonNode & loggers = loggingNode["loggers"];
|
|
||||||
if(!loggers.isNull())
|
|
||||||
{
|
{
|
||||||
BOOST_FOREACH(auto & loggerNode, loggers.Vector())
|
const JsonNode & loggingNode = settings["logging"];
|
||||||
|
if(loggingNode.isNull()) throw std::runtime_error("Settings haven't been loaded.");
|
||||||
|
|
||||||
|
// Configure loggers
|
||||||
|
const JsonNode & loggers = loggingNode["loggers"];
|
||||||
|
if(!loggers.isNull())
|
||||||
{
|
{
|
||||||
// Get logger
|
BOOST_FOREACH(auto & loggerNode, loggers.Vector())
|
||||||
std::string name = loggerNode["domain"].String();
|
|
||||||
CGLogger * logger = CGLogger::getLogger(CLoggerDomain(name));
|
|
||||||
|
|
||||||
// Set log level
|
|
||||||
logger->setLevel(getLogLevel(loggerNode["level"].String()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CGLogger::getGlobalLogger()->clearTargets();
|
|
||||||
|
|
||||||
// Add console target
|
|
||||||
auto consoleTarget = make_unique<CLogConsoleTarget>(console);
|
|
||||||
const JsonNode & consoleNode = loggingNode["console"];
|
|
||||||
if(!consoleNode.isNull())
|
|
||||||
{
|
|
||||||
const JsonNode & consoleFormatNode = consoleNode["format"];
|
|
||||||
if(!consoleFormatNode.isNull()) consoleTarget->setFormatter(CLogFormatter(consoleFormatNode.String()));
|
|
||||||
const JsonNode & consoleThresholdNode = consoleNode["threshold"];
|
|
||||||
if(!consoleThresholdNode.isNull()) consoleTarget->setThreshold(getLogLevel(consoleThresholdNode.String()));
|
|
||||||
const JsonNode & coloredConsoleEnabledNode = consoleNode["coloredOutputEnabled"];
|
|
||||||
consoleTarget->setColoredOutputEnabled(coloredConsoleEnabledNode.Bool());
|
|
||||||
|
|
||||||
CColorMapping colorMapping;
|
|
||||||
const JsonNode & colorMappingNode = consoleNode["colorMapping"];
|
|
||||||
if(!colorMappingNode.isNull())
|
|
||||||
{
|
|
||||||
BOOST_FOREACH(const JsonNode & mappingNode, colorMappingNode.Vector())
|
|
||||||
{
|
{
|
||||||
std::string domain = mappingNode["domain"].String();
|
// Get logger
|
||||||
std::string level = mappingNode["level"].String();
|
std::string name = loggerNode["domain"].String();
|
||||||
std::string color = mappingNode["color"].String();
|
CGLogger * logger = CGLogger::getLogger(CLoggerDomain(name));
|
||||||
colorMapping.setColorFor(CLoggerDomain(domain), getLogLevel(level), getConsoleColor(color));
|
|
||||||
|
// Set log level
|
||||||
|
logger->setLevel(getLogLevel(loggerNode["level"].String()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
consoleTarget->setColorMapping(colorMapping);
|
CGLogger::getGlobalLogger()->clearTargets();
|
||||||
}
|
|
||||||
CGLogger::getGlobalLogger()->addTarget(std::move(consoleTarget));
|
|
||||||
|
|
||||||
// Add file target
|
// Add console target
|
||||||
auto fileTarget = make_unique<CLogFileTarget>(filePath, appendToLogFile);
|
auto consoleTarget = make_unique<CLogConsoleTarget>(console);
|
||||||
const JsonNode & fileNode = loggingNode["file"];
|
const JsonNode & consoleNode = loggingNode["console"];
|
||||||
if(!fileNode.isNull())
|
if(!consoleNode.isNull())
|
||||||
{
|
{
|
||||||
const JsonNode & fileFormatNode = fileNode["format"];
|
const JsonNode & consoleFormatNode = consoleNode["format"];
|
||||||
if(!fileFormatNode.isNull()) fileTarget->setFormatter(CLogFormatter(fileFormatNode.String()));
|
if(!consoleFormatNode.isNull()) consoleTarget->setFormatter(CLogFormatter(consoleFormatNode.String()));
|
||||||
|
const JsonNode & consoleThresholdNode = consoleNode["threshold"];
|
||||||
|
if(!consoleThresholdNode.isNull()) consoleTarget->setThreshold(getLogLevel(consoleThresholdNode.String()));
|
||||||
|
const JsonNode & coloredConsoleEnabledNode = consoleNode["coloredOutputEnabled"];
|
||||||
|
consoleTarget->setColoredOutputEnabled(coloredConsoleEnabledNode.Bool());
|
||||||
|
|
||||||
|
CColorMapping colorMapping;
|
||||||
|
const JsonNode & colorMappingNode = consoleNode["colorMapping"];
|
||||||
|
if(!colorMappingNode.isNull())
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(const JsonNode & mappingNode, colorMappingNode.Vector())
|
||||||
|
{
|
||||||
|
std::string domain = mappingNode["domain"].String();
|
||||||
|
std::string level = mappingNode["level"].String();
|
||||||
|
std::string color = mappingNode["color"].String();
|
||||||
|
colorMapping.setColorFor(CLoggerDomain(domain), getLogLevel(level), getConsoleColor(color));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
consoleTarget->setColorMapping(colorMapping);
|
||||||
|
}
|
||||||
|
CGLogger::getGlobalLogger()->addTarget(std::move(consoleTarget));
|
||||||
|
|
||||||
|
// Add file target
|
||||||
|
auto fileTarget = make_unique<CLogFileTarget>(filePath, appendToLogFile);
|
||||||
|
const JsonNode & fileNode = loggingNode["file"];
|
||||||
|
if(!fileNode.isNull())
|
||||||
|
{
|
||||||
|
const JsonNode & fileFormatNode = fileNode["format"];
|
||||||
|
if(!fileFormatNode.isNull()) fileTarget->setFormatter(CLogFormatter(fileFormatNode.String()));
|
||||||
|
}
|
||||||
|
CGLogger::getGlobalLogger()->addTarget(std::move(fileTarget));
|
||||||
|
appendToLogFile = true;
|
||||||
}
|
}
|
||||||
CGLogger::getGlobalLogger()->addTarget(std::move(fileTarget));
|
catch(const std::exception & e)
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Could not initialize the logging system due to configuration error/s. The logging system can be in a corrupted state. " << e.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
logGlobal->infoStream() << "Initialized logging system based on settings successfully.";
|
||||||
}
|
}
|
||||||
|
|
||||||
ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level) const
|
ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level) const
|
||||||
|
@ -17,20 +17,19 @@ class CConsoleHandler;
|
|||||||
class JsonNode;
|
class JsonNode;
|
||||||
|
|
||||||
/// The class CBasicLogConfigurator reads log properties from settings.json and
|
/// The class CBasicLogConfigurator reads log properties from settings.json and
|
||||||
/// sets up the logging system.
|
/// sets up the logging system. Make sure that you use the same configurator object to
|
||||||
|
/// initialize the whole logging system. If you don't do so, the log file will be overwritten/truncated.
|
||||||
class DLL_LINKAGE CBasicLogConfigurator
|
class DLL_LINKAGE CBasicLogConfigurator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console);
|
CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console);
|
||||||
|
|
||||||
/// Configures the logging system by parsing the logging settings. It adds the console target and the file target to the global logger.
|
/// Configures the logging system by parsing the logging settings. It adds the console target and the file target to the global logger.
|
||||||
/// If the append parameter is true, the log file will be appended to. Otherwise the log file will be truncated.
|
/// Doesn't throw, but logs on success or fault.
|
||||||
/// Throws std::runtime_error if the configuration has errors.
|
void configure();
|
||||||
void configure(bool appendToLogFile = true);
|
|
||||||
|
|
||||||
/// Configures a default logging system by adding the console target and the file target to the global logger.
|
/// Configures a default logging system by adding the console target and the file target to the global logger.
|
||||||
/// If the append parameter is true, the log file will be appended to. Otherwise the log file will be truncated.
|
void configureDefault();
|
||||||
void configureDefault(bool appendToLogFile = true);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ELogLevel::ELogLevel getLogLevel(const std::string & level) const;
|
ELogLevel::ELogLevel getLogLevel(const std::string & level) const;
|
||||||
@ -38,4 +37,5 @@ private:
|
|||||||
|
|
||||||
std::string filePath;
|
std::string filePath;
|
||||||
CConsoleHandler * console;
|
CConsoleHandler * console;
|
||||||
|
bool appendToLogFile;
|
||||||
};
|
};
|
||||||
|
@ -211,7 +211,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//give prim skill
|
//give prim skill
|
||||||
tlog5 << hero->name <<" got level "<<hero->level<<std::endl;
|
logGlobal->traceStream() << hero->name <<" got level "<<hero->level;
|
||||||
int r = rand()%100, pom=0, x=0;
|
int r = rand()%100, pom=0, x=0;
|
||||||
|
|
||||||
auto & skillChances = (hero->level>9) ? hero->type->heroClass->primarySkillLowLevel : hero->type->heroClass->primarySkillHighLevel;
|
auto & skillChances = (hero->level>9) ? hero->type->heroClass->primarySkillLowLevel : hero->type->heroClass->primarySkillHighLevel;
|
||||||
@ -222,7 +222,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
|
|||||||
if(r<pom)
|
if(r<pom)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tlog5 << "The hero gets the primary skill with the no. " << x << " with a probability of " << r << "%." << std::endl;
|
logGlobal->traceStream() << "The hero gets the primary skill with the no. " << x << " with a probability of " << r << "%.";
|
||||||
SetPrimSkill sps;
|
SetPrimSkill sps;
|
||||||
sps.id = hero->id;
|
sps.id = hero->id;
|
||||||
sps.which = static_cast<PrimarySkill::PrimarySkill>(x);
|
sps.which = static_cast<PrimarySkill::PrimarySkill>(x);
|
||||||
@ -904,7 +904,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
|
|||||||
c >> player >> requestID >> pack; //get the package
|
c >> player >> requestID >> pack; //get the package
|
||||||
packType = typeList.getTypeID(pack); //get the id of type
|
packType = typeList.getTypeID(pack); //get the id of type
|
||||||
|
|
||||||
tlog5 << boost::format("Received client message (request %d by player %d) of type with ID=%d (%s).\n")
|
logGlobal->traceStream() << boost::format("Received client message (request %d by player %d) of type with ID=%d (%s).\n")
|
||||||
% requestID % player.getNum() % packType % typeid(*pack).name();
|
% requestID % player.getNum() % packType % typeid(*pack).name();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -927,7 +927,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
|
|||||||
else if(apply)
|
else if(apply)
|
||||||
{
|
{
|
||||||
bool result = apply->applyOnGH(this,&c,pack, player);
|
bool result = apply->applyOnGH(this,&c,pack, player);
|
||||||
tlog5 << "Message successfully applied (result=" << result << ")!\n";
|
logGlobal->traceStream() << "Message successfully applied (result=" << result << ")!";
|
||||||
|
|
||||||
//send confirmation that we've applied the package
|
//send confirmation that we've applied the package
|
||||||
applied.result = result;
|
applied.result = result;
|
||||||
@ -938,7 +938,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tlog1 << "Message cannot be applied, cannot find applier (unregistered type)!\n";
|
logGlobal->errorStream() << "Message cannot be applied, cannot find applier (unregistered type)!";
|
||||||
}
|
}
|
||||||
|
|
||||||
vstd::clear_pointer(pack);
|
vstd::clear_pointer(pack);
|
||||||
@ -947,12 +947,12 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
|
|||||||
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
|
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
|
||||||
{
|
{
|
||||||
assert(!c.connected); //make sure that connection has been marked as broken
|
assert(!c.connected); //make sure that connection has been marked as broken
|
||||||
tlog1 << e.what() << std::endl;
|
logGlobal->errorStream() << e.what();
|
||||||
end2 = true;
|
end2 = true;
|
||||||
}
|
}
|
||||||
HANDLE_EXCEPTION(end2 = true);
|
HANDLE_EXCEPTION(end2 = true);
|
||||||
|
|
||||||
tlog1 << "Ended handling connection\n";
|
logGlobal->errorStream() << "Ended handling connection";
|
||||||
}
|
}
|
||||||
|
|
||||||
int CGameHandler::moveStack(int stack, BattleHex dest)
|
int CGameHandler::moveStack(int stack, BattleHex dest)
|
||||||
@ -1103,9 +1103,9 @@ void CGameHandler::init(StartInfo *si)
|
|||||||
si->seedToBeUsed = std::time(NULL);
|
si->seedToBeUsed = std::time(NULL);
|
||||||
|
|
||||||
gs = new CGameState();
|
gs = new CGameState();
|
||||||
tlog0 << "Gamestate created!" << std::endl;
|
logGlobal->infoStream() << "Gamestate created!";
|
||||||
gs->init(si);
|
gs->init(si);
|
||||||
tlog0 << "Gamestate initialized!" << std::endl;
|
logGlobal->infoStream() << "Gamestate initialized!";
|
||||||
|
|
||||||
for(auto i = gs->players.begin(); i != gs->players.end(); i++)
|
for(auto i = gs->players.begin(); i != gs->players.end(); i++)
|
||||||
states.addPlayer(i->first);
|
states.addPlayer(i->first);
|
||||||
@ -1121,7 +1121,7 @@ void CGameHandler::setPortalDwelling(const CGTownInstance * town, bool forced=fa
|
|||||||
const PlayerState *p = gs->getPlayer(town->tempOwner);
|
const PlayerState *p = gs->getPlayer(town->tempOwner);
|
||||||
if(!p)
|
if(!p)
|
||||||
{
|
{
|
||||||
tlog3 << "There is no player owner of town " << town->name << " at " << town->pos << std::endl;
|
logGlobal->warnStream() << "There is no player owner of town " << town->name << " at " << town->pos;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1154,7 +1154,7 @@ void CGameHandler::setPortalDwelling(const CGTownInstance * town, bool forced=fa
|
|||||||
|
|
||||||
void CGameHandler::newTurn()
|
void CGameHandler::newTurn()
|
||||||
{
|
{
|
||||||
tlog5 << "Turn " << gs->day+1 << std::endl;
|
logGlobal->traceStream() << "Turn " << gs->day+1;
|
||||||
NewTurn n;
|
NewTurn n;
|
||||||
n.specialWeek = NewTurn::NO_ACTION;
|
n.specialWeek = NewTurn::NO_ACTION;
|
||||||
n.creatureid = CreatureID::NONE;
|
n.creatureid = CreatureID::NONE;
|
||||||
@ -1459,7 +1459,7 @@ void CGameHandler::newTurn()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog5 << "Info about turn " << n.day << "has been sent!" << std::endl;
|
logGlobal->traceStream() << "Info about turn " << n.day << "has been sent!";
|
||||||
handleTimeEvents();
|
handleTimeEvents();
|
||||||
//call objects
|
//call objects
|
||||||
for(size_t i = 0; i<gs->map->objects.size(); i++)
|
for(size_t i = 0; i<gs->map->objects.size(); i++)
|
||||||
@ -1517,16 +1517,17 @@ void CGameHandler::run(bool resume)
|
|||||||
std::set<PlayerColor> players;
|
std::set<PlayerColor> players;
|
||||||
(*cc) >> players; //how many players will be handled at that client
|
(*cc) >> players; //how many players will be handled at that client
|
||||||
|
|
||||||
tlog0 << "Connection " << cc->connectionID << " will handle " << players.size() << " player: ";
|
std::stringstream sbuffer;
|
||||||
|
sbuffer << "Connection " << cc->connectionID << " will handle " << players.size() << " player: ";
|
||||||
BOOST_FOREACH(PlayerColor color, players)
|
BOOST_FOREACH(PlayerColor color, players)
|
||||||
{
|
{
|
||||||
tlog0 << color << " ";
|
sbuffer << color << " ";
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(gsm);
|
boost::unique_lock<boost::recursive_mutex> lock(gsm);
|
||||||
connections[color] = cc;
|
connections[color] = cc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tlog0 << std::endl;
|
logGlobal->infoStream() << sbuffer.str();
|
||||||
|
|
||||||
cc->addStdVecItems(gs);
|
cc->addStdVecItems(gs);
|
||||||
cc->enableStackSendingByID();
|
cc->enableStackSendingByID();
|
||||||
@ -1660,7 +1661,7 @@ bool CGameHandler::removeObject( const CGObjectInstance * obj )
|
|||||||
{
|
{
|
||||||
if(!obj || !getObj(obj->id))
|
if(!obj || !getObj(obj->id))
|
||||||
{
|
{
|
||||||
tlog1 << "Something wrong, that object already has been removed or hasn't existed!\n";
|
logGlobal->errorStream() << "Something wrong, that object already has been removed or hasn't existed!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1685,16 +1686,16 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
|
|||||||
if(!h || (asker != PlayerColor::NEUTRAL && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function)
|
if(!h || (asker != PlayerColor::NEUTRAL && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
tlog1 << "Illegal call to move hero!\n";
|
logGlobal->errorStream() << "Illegal call to move hero!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog5 << "Player " << asker << " wants to move hero "<< hid.getNum() << " from "<< h->pos << " to " << dst << std::endl;
|
logGlobal->traceStream() << "Player " << asker << " wants to move hero "<< hid.getNum() << " from "<< h->pos << " to " << dst;
|
||||||
int3 hmpos = dst + int3(-1,0,0);
|
int3 hmpos = dst + int3(-1,0,0);
|
||||||
|
|
||||||
if(!gs->map->isInTheMap(hmpos))
|
if(!gs->map->isInTheMap(hmpos))
|
||||||
{
|
{
|
||||||
tlog1 << "Destination tile is outside the map!\n";
|
logGlobal->errorStream() << "Destination tile is outside the map!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1766,7 +1767,7 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
|
|||||||
//can't move to that tile but we visit object
|
//can't move to that tile but we visit object
|
||||||
objectVisited(t.visitableObjects.back(), h);
|
objectVisited(t.visitableObjects.back(), h);
|
||||||
|
|
||||||
tlog5 << "Blocking visit at " << hmpos << std::endl;
|
logGlobal->traceStream() << "Blocking visit at " << hmpos;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1810,12 +1811,12 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
|
|||||||
tmh.attackedFrom = guardPos;
|
tmh.attackedFrom = guardPos;
|
||||||
applyWithResult(TryMoveHero::SUCCESS);
|
applyWithResult(TryMoveHero::SUCCESS);
|
||||||
|
|
||||||
tlog5 << "Moved to " <<tmh.end<<std::endl;
|
logGlobal->traceStream() << "Moved to " <<tmh.end;
|
||||||
|
|
||||||
if (!tryAttackingGuard(guardPos, h)) // If a creature guards the tile, block visit.
|
if (!tryAttackingGuard(guardPos, h)) // If a creature guards the tile, block visit.
|
||||||
visitObjectOnTile(t, h);
|
visitObjectOnTile(t, h);
|
||||||
|
|
||||||
tlog5 << "Movement end!\n";
|
logGlobal->traceStream() << "Movement end!";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else //instant move - teleportation
|
else //instant move - teleportation
|
||||||
@ -1845,7 +1846,7 @@ bool CGameHandler::teleportHero(ObjectInstanceID hid, ObjectInstanceID dstid, ui
|
|||||||
const CGTownInstance *t = getTown(dstid);
|
const CGTownInstance *t = getTown(dstid);
|
||||||
|
|
||||||
if ( !h || !t || h->getOwner() != gs->currentPlayer )
|
if ( !h || !t || h->getOwner() != gs->currentPlayer )
|
||||||
tlog1<<"Invalid call to teleportHero!";
|
logGlobal->errorStream()<<"Invalid call to teleportHero!";
|
||||||
|
|
||||||
const CGTownInstance *from = h->visitedTown;
|
const CGTownInstance *from = h->visitedTown;
|
||||||
if(((h->getOwner() != t->getOwner())
|
if(((h->getOwner() != t->getOwner())
|
||||||
@ -2216,7 +2217,7 @@ void CGameHandler::heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)
|
|||||||
void CGameHandler::prepareNewQuery(Query * queryPack, PlayerColor player, const boost::function<void(ui32)> &callback)
|
void CGameHandler::prepareNewQuery(Query * queryPack, PlayerColor player, const boost::function<void(ui32)> &callback)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(gsm);
|
boost::unique_lock<boost::recursive_mutex> lock(gsm);
|
||||||
tlog4 << "Creating a query for player " << player << " with ID=" << QID << std::endl;
|
logGlobal->debugStream() << "Creating a query for player " << player << " with ID=" << QID;
|
||||||
callbacks[QID] = callback;
|
callbacks[QID] = callback;
|
||||||
states.addQuery(player, QID);
|
states.addQuery(player, QID);
|
||||||
queryPack->queryID = QID;
|
queryPack->queryID = QID;
|
||||||
@ -2239,7 +2240,7 @@ void CGameHandler::ask( Query * sel, PlayerColor player, const CFunctionList<voi
|
|||||||
|
|
||||||
void CGameHandler::sendToAllClients( CPackForClient * info )
|
void CGameHandler::sendToAllClients( CPackForClient * info )
|
||||||
{
|
{
|
||||||
tlog5 << "Sending to all clients a package of type " << typeid(*info).name() << std::endl;
|
logGlobal->traceStream() << "Sending to all clients a package of type " << typeid(*info).name();
|
||||||
for(std::set<CConnection*>::iterator i=conns.begin(); i!=conns.end();i++)
|
for(std::set<CConnection*>::iterator i=conns.begin(); i!=conns.end();i++)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::mutex> lock(*(*i)->wmx);
|
boost::unique_lock<boost::mutex> lock(*(*i)->wmx);
|
||||||
@ -2297,13 +2298,13 @@ void CGameHandler::sendAndApply( NewStructures * info )
|
|||||||
|
|
||||||
void CGameHandler::save(const std::string & filename )
|
void CGameHandler::save(const std::string & filename )
|
||||||
{
|
{
|
||||||
tlog1 << "Saving to " << filename << "\n";
|
logGlobal->errorStream() << "Saving to " << filename;
|
||||||
CFileInfo info(filename);
|
CFileInfo info(filename);
|
||||||
CResourceHandler::get()->createResource(info.getStem() + ".vlgm1");
|
CResourceHandler::get()->createResource(info.getStem() + ".vlgm1");
|
||||||
CResourceHandler::get()->createResource(info.getStem() + ".vsgm1");
|
CResourceHandler::get()->createResource(info.getStem() + ".vsgm1");
|
||||||
|
|
||||||
{
|
{
|
||||||
tlog0 << "Ordering clients to serialize...\n";
|
logGlobal->infoStream() << "Ordering clients to serialize...";
|
||||||
SaveGame sg(info.getStem() + ".vcgm1");
|
SaveGame sg(info.getStem() + ".vcgm1");
|
||||||
sendToAllClients(&sg);
|
sendToAllClients(&sg);
|
||||||
}
|
}
|
||||||
@ -2311,7 +2312,7 @@ void CGameHandler::save(const std::string & filename )
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// {
|
// {
|
||||||
// tlog0 << "Serializing game info...\n";
|
// logGlobal->infoStream() << "Serializing game info...";
|
||||||
// CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::LIB_SAVEGAME)));
|
// CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::LIB_SAVEGAME)));
|
||||||
// // char hlp[8] = "VCMISVG";
|
// // char hlp[8] = "VCMISVG";
|
||||||
// // save << hlp;
|
// // save << hlp;
|
||||||
@ -2321,20 +2322,20 @@ void CGameHandler::save(const std::string & filename )
|
|||||||
{
|
{
|
||||||
CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::SERVER_SAVEGAME)));
|
CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::SERVER_SAVEGAME)));
|
||||||
saveCommonState(save);
|
saveCommonState(save);
|
||||||
tlog0 << "Saving server state\n";
|
logGlobal->infoStream() << "Saving server state";
|
||||||
save << *this;
|
save << *this;
|
||||||
}
|
}
|
||||||
tlog0 << "Game has been successfully saved!\n";
|
logGlobal->infoStream() << "Game has been successfully saved!";
|
||||||
}
|
}
|
||||||
catch(std::exception &e)
|
catch(std::exception &e)
|
||||||
{
|
{
|
||||||
tlog1 << "Failed to save game: " << e.what() << std::endl;
|
logGlobal->errorStream() << "Failed to save game: " << e.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::close()
|
void CGameHandler::close()
|
||||||
{
|
{
|
||||||
tlog0 << "We have been requested to close.\n";
|
logGlobal->infoStream() << "We have been requested to close.";
|
||||||
|
|
||||||
if(gs->initialOpts->mode == StartInfo::DUEL)
|
if(gs->initialOpts->mode == StartInfo::DUEL)
|
||||||
{
|
{
|
||||||
@ -3294,7 +3295,7 @@ static EndAction end_action;
|
|||||||
|
|
||||||
bool CGameHandler::makeBattleAction( BattleAction &ba )
|
bool CGameHandler::makeBattleAction( BattleAction &ba )
|
||||||
{
|
{
|
||||||
tlog1 << "\tMaking action of type " << ba.actionType << std::endl;
|
logGlobal->errorStream() << "\tMaking action of type " << ba.actionType;
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
|
||||||
|
|
||||||
@ -3421,7 +3422,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
|
|||||||
BattleHex startingPos = stack->position;
|
BattleHex startingPos = stack->position;
|
||||||
int distance = moveStack(ba.stackNumber, ba.destinationTile);
|
int distance = moveStack(ba.stackNumber, ba.destinationTile);
|
||||||
|
|
||||||
tlog5 << stack->nodeName() << " will attack " << stackAtEnd->nodeName() << std::endl;
|
logGlobal->traceStream() << stack->nodeName() << " will attack " << stackAtEnd->nodeName();
|
||||||
|
|
||||||
if(stack->position != ba.destinationTile //we wasn't able to reach destination tile
|
if(stack->position != ba.destinationTile //we wasn't able to reach destination tile
|
||||||
&& !(stack->doubleWide()
|
&& !(stack->doubleWide()
|
||||||
@ -3430,7 +3431,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
std::string problem = "We cannot move this stack to its destination " + stack->getCreature()->namePl;
|
std::string problem = "We cannot move this stack to its destination " + stack->getCreature()->namePl;
|
||||||
tlog3 << problem << std::endl;
|
logGlobal->warnStream() << problem;
|
||||||
complain(problem);
|
complain(problem);
|
||||||
ok = false;
|
ok = false;
|
||||||
sendAndApply(&end_action);
|
sendAndApply(&end_action);
|
||||||
@ -4437,12 +4438,12 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
const CGHeroInstance *secondHero = gs->curB->heroes[!ba.side];
|
const CGHeroInstance *secondHero = gs->curB->heroes[!ba.side];
|
||||||
if(!h)
|
if(!h)
|
||||||
{
|
{
|
||||||
tlog2 << "Wrong caster!\n";
|
logGlobal->warnStream() << "Wrong caster!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(ba.additionalInfo >= VLC->spellh->spells.size())
|
if(ba.additionalInfo >= VLC->spellh->spells.size())
|
||||||
{
|
{
|
||||||
tlog2 << "Wrong spell id (" << ba.additionalInfo << ")!\n";
|
logGlobal->warnStream() << "Wrong spell id (" << ba.additionalInfo << ")!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4455,8 +4456,8 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
ESpellCastProblem::ESpellCastProblem escp = gs->curB->battleCanCastThisSpell(h->tempOwner, s, ECastingMode::HERO_CASTING);
|
ESpellCastProblem::ESpellCastProblem escp = gs->curB->battleCanCastThisSpell(h->tempOwner, s, ECastingMode::HERO_CASTING);
|
||||||
if(escp != ESpellCastProblem::OK)
|
if(escp != ESpellCastProblem::OK)
|
||||||
{
|
{
|
||||||
tlog2 << "Spell cannot be cast!\n";
|
logGlobal->warnStream() << "Spell cannot be cast!";
|
||||||
tlog2 << "Problem : " << escp << std::endl;
|
logGlobal->warnStream() << "Problem : " << escp;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4484,7 +4485,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tlog2 << "Spell " << s->name << " is not yet supported!\n";
|
logGlobal->warnStream() << "Spell " << s->name << " is not yet supported!";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4847,7 +4848,7 @@ void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n)
|
|||||||
bool CGameHandler::complain( const std::string &problem )
|
bool CGameHandler::complain( const std::string &problem )
|
||||||
{
|
{
|
||||||
sendMessageToAll("Server encountered a problem: " + problem);
|
sendMessageToAll("Server encountered a problem: " + problem);
|
||||||
tlog1 << problem << std::endl;
|
logGlobal->errorStream() << problem;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6018,7 +6019,7 @@ void CGameHandler::runBattle()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tlog5 << "Activating " << next->nodeName() << std::endl;
|
logGlobal->traceStream() << "Activating " << next->nodeName();
|
||||||
BattleSetActiveStack sas;
|
BattleSetActiveStack sas;
|
||||||
sas.stack = next->ID;
|
sas.stack = next->ID;
|
||||||
sendAndApply(&sas);
|
sendAndApply(&sas);
|
||||||
@ -6173,12 +6174,12 @@ void CGameHandler::spawnWanderingMonsters(CreatureID creatureID)
|
|||||||
getFreeTiles(tiles);
|
getFreeTiles(tiles);
|
||||||
ui32 amount = tiles.size() / 200; //Chance is 0.5% for each tile
|
ui32 amount = tiles.size() / 200; //Chance is 0.5% for each tile
|
||||||
std::random_shuffle(tiles.begin(), tiles.end());
|
std::random_shuffle(tiles.begin(), tiles.end());
|
||||||
tlog5 << "Spawning wandering monsters. Found " << tiles.size() << " free tiles. Creature type: " << creatureID << std::endl;
|
logGlobal->traceStream() << "Spawning wandering monsters. Found " << tiles.size() << " free tiles. Creature type: " << creatureID;
|
||||||
const CCreature *cre = VLC->creh->creatures[creatureID];
|
const CCreature *cre = VLC->creh->creatures[creatureID];
|
||||||
for (int i = 0; i < amount; ++i)
|
for (int i = 0; i < amount; ++i)
|
||||||
{
|
{
|
||||||
tile = tiles.begin();
|
tile = tiles.begin();
|
||||||
tlog5 << "\tSpawning monster at " << *tile << std::endl;
|
logGlobal->traceStream() << "\tSpawning monster at " << *tile;
|
||||||
putNewMonster(creatureID, cre->getRandomAmount(std::rand), *tile);
|
putNewMonster(creatureID, cre->getRandomAmount(std::rand), *tile);
|
||||||
tiles.erase(tile); //not use it again
|
tiles.erase(tile); //not use it again
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include "../lib/mapping/CMapInfo.h"
|
#include "../lib/mapping/CMapInfo.h"
|
||||||
#include "../lib/CObjectHandler.h"
|
#include "../lib/CObjectHandler.h"
|
||||||
#include "../lib/GameConstants.h"
|
#include "../lib/GameConstants.h"
|
||||||
|
#include "../lib/logging/CBasicLogConfigurator.h"
|
||||||
|
#include "../lib/CConfigHandler.h"
|
||||||
|
|
||||||
#include "../lib/UnlockGuard.h"
|
#include "../lib/UnlockGuard.h"
|
||||||
|
|
||||||
@ -74,7 +76,7 @@ void CPregameServer::handleConnection(CConnection *cpc)
|
|||||||
CPackForSelectionScreen *cpfs = NULL;
|
CPackForSelectionScreen *cpfs = NULL;
|
||||||
*cpc >> cpfs;
|
*cpc >> cpfs;
|
||||||
|
|
||||||
tlog0 << "Got package to announce " << typeid(*cpfs).name() << " from " << *cpc << std::endl;
|
logNetwork->infoStream() << "Got package to announce " << typeid(*cpfs).name() << " from " << *cpc;
|
||||||
|
|
||||||
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
||||||
bool quitting = dynamic_cast<QuitMenuWithoutStarting*>(cpfs),
|
bool quitting = dynamic_cast<QuitMenuWithoutStarting*>(cpfs),
|
||||||
@ -102,7 +104,7 @@ void CPregameServer::handleConnection(CConnection *cpc)
|
|||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
||||||
tlog0 << *cpc << " dies... \nWhat happened: " << e.what() << std::endl;
|
logNetwork->errorStream() << *cpc << " dies... \nWhat happened: " << e.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
boost::unique_lock<boost::recursive_mutex> queueLock(mx);
|
||||||
@ -118,13 +120,13 @@ void CPregameServer::handleConnection(CConnection *cpc)
|
|||||||
|
|
||||||
if(!connections.size())
|
if(!connections.size())
|
||||||
{
|
{
|
||||||
tlog0 << "Last connection lost, server will close itself...\n";
|
logNetwork->errorStream() << "Last connection lost, server will close itself...";
|
||||||
boost::this_thread::sleep(boost::posix_time::seconds(2)); //we should never be hasty when networking
|
boost::this_thread::sleep(boost::posix_time::seconds(2)); //we should never be hasty when networking
|
||||||
state = ENDING_WITHOUT_START;
|
state = ENDING_WITHOUT_START;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog0 << "Thread listening for " << *cpc << " ended\n";
|
logNetwork->infoStream() << "Thread listening for " << *cpc << " ended";
|
||||||
listeningThreads--;
|
listeningThreads--;
|
||||||
vstd::clear_pointer(cpc->handler);
|
vstd::clear_pointer(cpc->handler);
|
||||||
}
|
}
|
||||||
@ -152,7 +154,7 @@ void CPregameServer::run()
|
|||||||
|
|
||||||
if(state != RUNNING)
|
if(state != RUNNING)
|
||||||
{
|
{
|
||||||
tlog0 << "Stopping listening for connections...\n";
|
logNetwork->infoStream() << "Stopping listening for connections...";
|
||||||
acceptor->close();
|
acceptor->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,13 +168,13 @@ void CPregameServer::run()
|
|||||||
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog0 << "Thread handling connections ended\n";
|
logNetwork->infoStream() << "Thread handling connections ended";
|
||||||
|
|
||||||
if(state == ENDING_AND_STARTING_GAME)
|
if(state == ENDING_AND_STARTING_GAME)
|
||||||
{
|
{
|
||||||
tlog0 << "Waiting for listening thread to finish...\n";
|
logNetwork->infoStream() << "Waiting for listening thread to finish...";
|
||||||
while(listeningThreads) boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
while(listeningThreads) boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
||||||
tlog0 << "Preparing new game\n";
|
logNetwork->infoStream() << "Preparing new game";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,11 +195,11 @@ void CPregameServer::connectionAccepted(const boost::system::error_code& ec)
|
|||||||
{
|
{
|
||||||
if(ec)
|
if(ec)
|
||||||
{
|
{
|
||||||
tlog0 << "Something wrong during accepting: " << ec.message() << std::endl;
|
logNetwork->infoStream() << "Something wrong during accepting: " << ec.message();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog0 << "We got a new connection! :)\n";
|
logNetwork->infoStream() << "We got a new connection! :)";
|
||||||
CConnection *pc = new CConnection(upcomingConnection, NAME);
|
CConnection *pc = new CConnection(upcomingConnection, NAME);
|
||||||
initConnection(pc);
|
initConnection(pc);
|
||||||
upcomingConnection = NULL;
|
upcomingConnection = NULL;
|
||||||
@ -226,7 +228,7 @@ void CPregameServer::start_async_accept()
|
|||||||
|
|
||||||
void CPregameServer::announceTxt(const std::string &txt, const std::string &playerName /*= "system"*/)
|
void CPregameServer::announceTxt(const std::string &txt, const std::string &playerName /*= "system"*/)
|
||||||
{
|
{
|
||||||
tlog0 << playerName << " says: " << txt << std::endl;
|
logNetwork->infoStream() << playerName << " says: " << txt;
|
||||||
ChatMessage cm;
|
ChatMessage cm;
|
||||||
cm.playerName = playerName;
|
cm.playerName = playerName;
|
||||||
cm.message = txt;
|
cm.message = txt;
|
||||||
@ -245,7 +247,7 @@ void CPregameServer::sendPack(CConnection * pc, const CPackForSelectionScreen &
|
|||||||
{
|
{
|
||||||
if(!pc->sendStop)
|
if(!pc->sendStop)
|
||||||
{
|
{
|
||||||
tlog0 << "\tSending pack of type " << typeid(pack).name() << " to " << *pc << std::endl;
|
logNetwork->infoStream() << "\tSending pack of type " << typeid(pack).name() << " to " << *pc;
|
||||||
*pc << &pack;
|
*pc << &pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,7 +296,7 @@ void CPregameServer::initConnection(CConnection *c)
|
|||||||
{
|
{
|
||||||
*c >> c->name;
|
*c >> c->name;
|
||||||
connections.insert(c);
|
connections.insert(c);
|
||||||
tlog0 << "Pregame connection with player " << c->name << " established!" << std::endl;
|
logNetwork->infoStream() << "Pregame connection with player " << c->name << " established!";
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPregameServer::startListeningThread(CConnection * pc)
|
void CPregameServer::startListeningThread(CConnection * pc)
|
||||||
@ -307,7 +309,7 @@ void CPregameServer::startListeningThread(CConnection * pc)
|
|||||||
CVCMIServer::CVCMIServer()
|
CVCMIServer::CVCMIServer()
|
||||||
: io(new boost::asio::io_service()), acceptor(new TAcceptor(*io, tcp::endpoint(tcp::v4(), port))), firstConnection(NULL)
|
: io(new boost::asio::io_service()), acceptor(new TAcceptor(*io, tcp::endpoint(tcp::v4(), port))), firstConnection(NULL)
|
||||||
{
|
{
|
||||||
tlog4 << "CVCMIServer created!" <<std::endl;
|
logNetwork->debugStream() << "CVCMIServer created!";
|
||||||
}
|
}
|
||||||
CVCMIServer::~CVCMIServer()
|
CVCMIServer::~CVCMIServer()
|
||||||
{
|
{
|
||||||
@ -396,7 +398,7 @@ void CVCMIServer::start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
boost::system::error_code error;
|
boost::system::error_code error;
|
||||||
tlog0<<"Listening for connections at port " << acceptor->local_endpoint().port() << std::endl;
|
logNetwork->infoStream()<<"Listening for connections at port " << acceptor->local_endpoint().port();
|
||||||
tcp::socket * s = new tcp::socket(acceptor->get_io_service());
|
tcp::socket * s = new tcp::socket(acceptor->get_io_service());
|
||||||
boost::thread acc(boost::bind(vaccept,acceptor,s,&error));
|
boost::thread acc(boost::bind(vaccept,acceptor,s,&error));
|
||||||
sr->setToTrueAndNotify();
|
sr->setToTrueAndNotify();
|
||||||
@ -405,12 +407,12 @@ void CVCMIServer::start()
|
|||||||
acc.join();
|
acc.join();
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
tlog2<<"Got connection but there is an error " << std::endl << error;
|
logNetwork->warnStream()<<"Got connection but there is an error " << error;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tlog0<<"We've accepted someone... " << std::endl;
|
logNetwork->infoStream()<<"We've accepted someone... ";
|
||||||
firstConnection = new CConnection(s,NAME);
|
firstConnection = new CConnection(s,NAME);
|
||||||
tlog0<<"Got connection!" << std::endl;
|
logNetwork->infoStream()<<"Got connection!";
|
||||||
while(!end2)
|
while(!end2)
|
||||||
{
|
{
|
||||||
ui8 mode;
|
ui8 mode;
|
||||||
@ -455,14 +457,14 @@ void CVCMIServer::loadGame()
|
|||||||
//
|
//
|
||||||
// CLoadFile lf(CResourceHandler::get()->getResourceName(ResourceID(fname, EResType::LIB_SAVEGAME)));
|
// CLoadFile lf(CResourceHandler::get()->getResourceName(ResourceID(fname, EResType::LIB_SAVEGAME)));
|
||||||
// lf >> sig >> dum >> si;
|
// lf >> sig >> dum >> si;
|
||||||
// tlog0 <<"Reading save signature"<<std::endl;
|
// logNetwork->infoStream() <<"Reading save signature";
|
||||||
//
|
//
|
||||||
// lf >> *VLC;
|
// lf >> *VLC;
|
||||||
// tlog0 <<"Reading handlers"<<std::endl;
|
// logNetwork->infoStream() <<"Reading handlers";
|
||||||
//
|
//
|
||||||
// lf >> (gh.gs);
|
// lf >> (gh.gs);
|
||||||
// c.addStdVecItems(gh.gs);
|
// c.addStdVecItems(gh.gs);
|
||||||
// tlog0 <<"Reading gamestate"<<std::endl;
|
// logNetwork->infoStream() <<"Reading gamestate";
|
||||||
// }
|
// }
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -486,7 +488,7 @@ void CVCMIServer::loadGame()
|
|||||||
acceptor->accept(*s,error);
|
acceptor->accept(*s,error);
|
||||||
if(error) //retry
|
if(error) //retry
|
||||||
{
|
{
|
||||||
tlog3<<"Cannot establish connection - retrying..." << std::endl;
|
logNetwork->warnStream()<<"Cannot establish connection - retrying...";
|
||||||
i--;
|
i--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -507,6 +509,8 @@ int main(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
logfile = new std::ofstream((VCMIDirs::get().localPath() + "/VCMI_Server_log.txt").c_str());
|
logfile = new std::ofstream((VCMIDirs::get().localPath() + "/VCMI_Server_log.txt").c_str());
|
||||||
console = new CConsoleHandler;
|
console = new CConsoleHandler;
|
||||||
|
CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Server_log2.txt", console);
|
||||||
|
logConfig.configureDefault();
|
||||||
//boost::thread t(boost::bind(&CConsoleHandler::run,::console));
|
//boost::thread t(boost::bind(&CConsoleHandler::run,::console));
|
||||||
if(argc > 1)
|
if(argc > 1)
|
||||||
{
|
{
|
||||||
@ -517,7 +521,10 @@ int main(int argc, char** argv)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
preinitDLL(console,logfile);
|
preinitDLL(console,logfile);
|
||||||
tlog0 << "Port " << port << " will be used." << std::endl;
|
settings.init();
|
||||||
|
logConfig.configure();
|
||||||
|
|
||||||
|
logNetwork->infoStream() << "Port " << port << " will be used.";
|
||||||
loadDLLClasses();
|
loadDLLClasses();
|
||||||
srand ( (ui32)time(NULL) );
|
srand ( (ui32)time(NULL) );
|
||||||
try
|
try
|
||||||
@ -535,13 +542,13 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
|
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
|
||||||
{
|
{
|
||||||
tlog1 << e.what() << std::endl;
|
logNetwork->errorStream() << e.what();
|
||||||
end2 = true;
|
end2 = true;
|
||||||
}HANDLE_EXCEPTION
|
}HANDLE_EXCEPTION
|
||||||
}
|
}
|
||||||
catch(boost::system::system_error &e)
|
catch(boost::system::system_error &e)
|
||||||
{
|
{
|
||||||
tlog1 << e.what() << std::endl;
|
logNetwork->errorStream() << e.what();
|
||||||
//catch any startup errors (e.g. can't access port) errors
|
//catch any startup errors (e.g. can't access port) errors
|
||||||
//and return non-zero status so client can detect error
|
//and return non-zero status so client can detect error
|
||||||
throw;
|
throw;
|
||||||
|
@ -17,12 +17,12 @@
|
|||||||
boost::unique_lock<boost::mutex> lock(*c->wmx); \
|
boost::unique_lock<boost::mutex> lock(*c->wmx); \
|
||||||
*c << &temp_message; \
|
*c << &temp_message; \
|
||||||
} \
|
} \
|
||||||
tlog1<<"Player is not allowed to perform this action!\n"; \
|
logNetwork->errorStream()<<"Player is not allowed to perform this action!"; \
|
||||||
return false;} while(0)
|
return false;} while(0)
|
||||||
|
|
||||||
#define WRONG_PLAYER_MSG(expectedplayer) do {std::ostringstream oss;\
|
#define WRONG_PLAYER_MSG(expectedplayer) do {std::ostringstream oss;\
|
||||||
oss << "You were identified as player " << gh->getPlayerAt(c) << " while expecting " << expectedplayer;\
|
oss << "You were identified as player " << gh->getPlayerAt(c) << " while expecting " << expectedplayer;\
|
||||||
tlog1 << oss.str() << std::endl; \
|
logNetwork->errorStream() << oss.str(); \
|
||||||
if(c) { SystemMessage temp_message(oss.str()); boost::unique_lock<boost::mutex> lock(*c->wmx); *c << &temp_message; } } while(0)
|
if(c) { SystemMessage temp_message(oss.str()); boost::unique_lock<boost::mutex> lock(*c->wmx); *c << &temp_message; } } while(0)
|
||||||
|
|
||||||
#define ERROR_IF_NOT_OWNS(id) do{if(!PLAYER_OWNS(id)){WRONG_PLAYER_MSG(gh->getOwner(id)); ERROR_AND_RETURN; }}while(0)
|
#define ERROR_IF_NOT_OWNS(id) do{if(!PLAYER_OWNS(id)){WRONG_PLAYER_MSG(gh->getOwner(id)); ERROR_AND_RETURN; }}while(0)
|
||||||
@ -295,7 +295,7 @@ bool SetSelection::applyGh( CGameHandler *gh )
|
|||||||
ERROR_IF_NOT(player);
|
ERROR_IF_NOT(player);
|
||||||
if(!gh->getObj(id))
|
if(!gh->getObj(id))
|
||||||
{
|
{
|
||||||
tlog1 << "No such object...\n";
|
logNetwork->errorStream() << "No such object...";
|
||||||
ERROR_AND_RETURN;
|
ERROR_AND_RETURN;
|
||||||
}
|
}
|
||||||
gh->sendAndApply(this);
|
gh->sendAndApply(this);
|
||||||
|
Loading…
Reference in New Issue
Block a user