25 #include "configuration/doomseekerconfig.h"
26 #include "configuration/queryspeed.h"
28 #include "pathfinder/pathfinder.h"
29 #include "pathfinder/wadpathfinder.h"
30 #include "plugins/engineplugin.h"
31 #include "serverapi/exefile.h"
32 #include "serverapi/gameclientrunner.h"
33 #include "serverapi/gameexeretriever.h"
34 #include "serverapi/message.h"
35 #include "serverapi/playerslist.h"
36 #include "serverapi/tooltips/tooltipgenerator.h"
37 #include "strings.hpp"
39 #include <QElapsedTimer>
49 gameMode = GameMode::mkCooperative();
77 QElapsedTimer lastRefreshClock;
88 QElapsedTimer pingClock;
90 bool randomMapRotation;
115 QWeakPointer<Server>
self;
126 QString
Server::teamNames[] =
139 d->bIsRefreshing =
false;
142 d->lockedInGame =
false;
143 d->testingServer =
false;
147 d->name = tr(
"<< ERROR >>");
153 for (
int i = 0; i < MAX_TEAMS; ++i)
158 d->randomMapRotation =
false;
162 d->lastRefreshClock.invalidate();
164 set_customDetails(&Server::customDetails_default);
165 set_createSendRequest(&Server::createSendRequest_default);
166 set_readRequest(&Server::readRequest_default);
168 if (gConfig.doomseeker.bLookupHosts)
181 POLYMORPHIC_DEFINE(Server::
Response, Server,
readRequest, (const QByteArray &data), (data))
200 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
206 if (!d->iwad.trimmed().isEmpty())
210 for (
const PWad &
wad : d->wads)
212 result << wad.
name();
219 if (d->iwad.contains(text, cs))
224 for (
int j = 0; j <
numWads(); ++j)
227 if (pwad.
name().contains(text, cs))
235 void Server::clearDMFlags()
240 QByteArray Server::createSendRequest_default()
242 assert(0 &&
"Server::createSendRequest() is not implemented");
262 f->setExeTypeName(tr(
"client"));
263 f->setConfigKey(
"BinaryPath");
267 const QString &Server::country()
const
272 QString Server::customDetails_default()
291 return plugin()->data()->name;
295 return tr(
"Undefined");
316 if (!forceAddress && gConfig.doomseeker.bLookupHosts &&
317 d->host.error() == QHostInfo::NoError && d->host.lookupId() != -1)
319 return QString(
"%1:%2").arg(d->host.hostName()).arg(
port());
321 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
336 return d->players.numClients() == 0;
341 return d->players.numClients() ==
maxClients();
361 return d->lockedInGame;
366 return d->randomMapRotation;
371 return d->bIsRefreshing;
386 return d->testingServer;
401 QHostInfo::lookupHost(
address().toString(),
this,
402 SLOT(setHostName(QHostInfo)));
417 return d->maxClients;
422 return d->maxPlayers;
427 return QList<GameCVar>();
443 return (returnValue < 0) ? 0 : returnValue;
448 int returnValue = d->maxPlayers - d->players.numClients();
449 return (returnValue < 0) ? 0 : returnValue;
455 return (returnValue < 0) ? 0 : returnValue;
465 return d->players[index];
486 assert(0 &&
"Server::readRequest(const QByteArray&) is not implemented.");
492 d->bIsRefreshing =
true;
495 d->triesLeft = gConfig.doomseeker.querySpeed().attemptsPerServer;
497 d->triesLeft = qMin(d->triesLeft, QuerySpeed::MAX_ATTEMPTS_PER_SERVER);
499 d->triesLeft = qMax(d->triesLeft, 1);
504 d->lastRefreshClock.start();
505 setResponse(response);
509 d->ping = d->pingClock.elapsed();
510 d->bPingIsSet =
true;
512 d->bIsRefreshing =
false;
513 d->iwad = d->iwad.toLower();
514 emit
updated(
self(), response);
519 return d->scores[team];
524 return d->scoreLimit;
544 if (d->triesLeft <= 0)
552 if (request.isEmpty())
558 d->bPingIsSet =
false;
559 d->pingClock.start();
568 d->country = country.trimmed().toUpper();
593 d->version = version;
596 void Server::setHostName(QHostInfo host)
599 if (!d->bIsRefreshing)
615 d->lockedInGame = locked;
625 d->mapName = mapName;
645 d->name = serverName;
647 d->name.replace(
'\n',
' ').replace(
'\r',
' ');
667 d->randomMapRotation = randomMapRotation;
670 void Server::setResponse(
Response response)
672 d->response = response;
683 void Server::setScores(
const QList<int> &
scores)
690 d->scoreLimit = serverScoreLimit;
695 d->bSecure = bSecure;
703 void Server::setTestingServer(
bool b)
705 d->testingServer = b;
710 d->timeLeft = serverTimeLeft;
715 d->timeLimit = serverTimeLimit;
723 void Server::setWads(
const QList<PWad> &
wads)
735 d->additionalWebSites = list;
742 case Player::TEAM_BLUE:
743 return qRgb(0, 0, 255);
744 case Player::TEAM_RED:
745 return qRgb(255, 0, 0);
746 case Player::TEAM_GREEN:
747 return qRgb(0, 255, 0);
748 case Player::TEAM_GOLD:
749 return qRgb(255, 255, 0);
752 return qRgb(0, 255, 0);
757 return team < MAX_TEAMS && team >= 0 ? teamNames[team] :
"";
772 if (d->lastRefreshClock.isValid())
774 return d->lastRefreshClock.elapsed();
794 return wads()[index];
809 QScopedPointer<ExeFile> exeFile(
clientExe());
828 return d->additionalWebSites;
843 void Server::setLan(
bool b)