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"
38 #include "templatedpathresolver.h"
40 #include <QElapsedTimer>
50 gameMode = GameMode::mkCooperative();
78 QElapsedTimer lastRefreshClock;
89 QElapsedTimer pingClock;
91 bool randomMapRotation;
116 QWeakPointer<Server>
self;
127 QString
Server::teamNames[] =
140 d->bIsRefreshing =
false;
143 d->lockedInGame =
false;
144 d->testingServer =
false;
148 d->name = tr(
"<< ERROR >>");
154 for (
int i = 0; i < MAX_TEAMS; ++i)
159 d->randomMapRotation =
false;
163 d->lastRefreshClock.invalidate();
165 set_customDetails(&Server::customDetails_default);
166 set_createSendRequest(&Server::createSendRequest_default);
167 set_readRequest(&Server::readRequest_default);
169 if (gConfig.doomseeker.bLookupHosts)
182 POLYMORPHIC_DEFINE(Server::
Response, Server,
readRequest, (const QByteArray &data), (data))
201 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
207 if (!d->iwad.trimmed().isEmpty())
211 for (
const PWad &
wad : d->wads)
213 result << wad.
name();
220 if (d->iwad.contains(text, cs))
225 for (
int j = 0; j <
numWads(); ++j)
228 if (pwad.
name().contains(text, cs))
236 void Server::clearDMFlags()
241 QByteArray Server::createSendRequest_default()
243 assert(0 &&
"Server::createSendRequest() is not implemented");
263 f->setExeTypeName(tr(
"client"));
264 f->setConfigKey(
"BinaryPath");
268 const QString &Server::country()
const
273 QString Server::customDetails_default()
292 return plugin()->data()->name;
296 return tr(
"Undefined");
317 if (!forceAddress && gConfig.doomseeker.bLookupHosts &&
318 d->host.error() == QHostInfo::NoError && d->host.lookupId() != -1)
320 return QString(
"%1:%2").arg(d->host.hostName()).arg(
port());
322 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
337 return d->players.numClients() == 0;
342 return d->players.numClients() ==
maxClients();
362 return d->lockedInGame;
367 return d->randomMapRotation;
372 return d->bIsRefreshing;
387 return d->testingServer;
402 QHostInfo::lookupHost(
address().toString(),
this,
403 SLOT(setHostName(QHostInfo)));
418 return d->maxClients;
423 return d->maxPlayers;
428 return QList<GameCVar>();
443 int returnValue =
static_cast<int>(d->maxClients)
444 - static_cast<int>(d->players.numClients());
445 return (returnValue < 0) ? 0 : returnValue;
450 int totalSlots =
static_cast<int>(qMin(d->maxPlayers, d->maxClients));
451 int returnValue = totalSlots - d->players.numPlayersInGame();
452 return (returnValue < 0) ? 0 : returnValue;
458 return (returnValue < 0) ? 0 : returnValue;
468 return d->players[index];
489 assert(0 &&
"Server::readRequest(const QByteArray&) is not implemented.");
495 d->bIsRefreshing =
true;
498 d->triesLeft = gConfig.doomseeker.querySpeed().attemptsPerServer;
500 d->triesLeft = qMin(d->triesLeft, QuerySpeed::MAX_ATTEMPTS_PER_SERVER);
502 d->triesLeft = qMax(d->triesLeft, 1);
507 d->lastRefreshClock.start();
508 setResponse(response);
512 d->ping = d->pingClock.elapsed();
513 d->bPingIsSet =
true;
515 d->bIsRefreshing =
false;
516 d->iwad = d->iwad.toLower();
517 emit
updated(
self(), response);
522 return d->scores[team];
527 return d->scoreLimit;
547 if (d->triesLeft <= 0)
555 if (request.isEmpty())
561 d->bPingIsSet =
false;
562 d->pingClock.start();
571 d->country = country.trimmed().toUpper();
596 d->version = version;
599 void Server::setHostName(QHostInfo host)
602 if (!d->bIsRefreshing)
618 d->lockedInGame = locked;
628 d->mapName = mapName;
648 d->name = serverName;
650 d->name.replace(
'\n',
' ').replace(
'\r',
' ');
670 d->randomMapRotation = randomMapRotation;
673 void Server::setResponse(
Response response)
675 d->response = response;
686 void Server::setScores(
const QList<int> &
scores)
693 d->scoreLimit = serverScoreLimit;
698 d->bSecure = bSecure;
706 void Server::setTestingServer(
bool b)
708 d->testingServer = b;
713 d->timeLeft = serverTimeLeft;
718 d->timeLimit = serverTimeLimit;
726 void Server::setWads(
const QList<PWad> &
wads)
738 d->additionalWebSites = list;
745 case Player::TEAM_BLUE:
746 return qRgb(0, 0, 255);
747 case Player::TEAM_RED:
748 return qRgb(255, 0, 0);
749 case Player::TEAM_GREEN:
750 return qRgb(0, 255, 0);
751 case Player::TEAM_GOLD:
752 return qRgb(255, 255, 0);
755 return qRgb(0, 255, 0);
760 return team < MAX_TEAMS && team >= 0 ? teamNames[team] :
"";
775 if (d->lastRefreshClock.isValid())
777 return d->lastRefreshClock.elapsed();
797 return wads()[index];
813 QScopedPointer<ExeFile> exeFile(
clientExe());
832 return d->additionalWebSites;
847 void Server::setLan(
bool b)