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();
76 QElapsedTimer lastRefreshClock;
87 QElapsedTimer pingClock;
89 bool randomMapRotation;
114 QWeakPointer<Server>
self;
125 QString
Server::teamNames[] =
138 d->bIsRefreshing =
false;
141 d->lockedInGame =
false;
142 d->testingServer =
false;
146 d->name = tr(
"<< ERROR >>");
152 for (
int i = 0; i < MAX_TEAMS; ++i)
157 d->randomMapRotation =
false;
161 d->lastRefreshClock.invalidate();
163 set_customDetails(&Server::customDetails_default);
164 set_createSendRequest(&Server::createSendRequest_default);
165 set_readRequest(&Server::readRequest_default);
167 if (gConfig.doomseeker.bLookupHosts)
180 POLYMORPHIC_DEFINE(Server::
Response, Server,
readRequest, (const QByteArray &data), (data))
199 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
205 if (!d->iwad.trimmed().isEmpty())
209 for (
const PWad &
wad : d->wads)
211 result << wad.
name();
218 if (d->iwad.contains(text, cs))
223 for (
int j = 0; j <
numWads(); ++j)
226 if (pwad.
name().contains(text, cs))
234 void Server::clearDMFlags()
239 QByteArray Server::createSendRequest_default()
241 assert(0 &&
"Server::createSendRequest() is not implemented");
261 f->setExeTypeName(tr(
"client"));
262 f->setConfigKey(
"BinaryPath");
266 QString Server::customDetails_default()
285 return plugin()->data()->name;
289 return tr(
"Undefined");
310 if (!forceAddress && gConfig.doomseeker.bLookupHosts &&
311 d->host.error() == QHostInfo::NoError && d->host.lookupId() != -1)
313 return QString(
"%1:%2").arg(d->host.hostName()).arg(
port());
315 return QString(
"%1:%2").arg(
address().toString()).arg(
port());
330 return d->players.numClients() == 0;
335 return d->players.numClients() ==
maxClients();
355 return d->lockedInGame;
360 return d->randomMapRotation;
365 return d->bIsRefreshing;
380 return d->testingServer;
395 QHostInfo::lookupHost(
address().toString(),
this,
396 SLOT(setHostName(QHostInfo)));
411 return d->maxClients;
416 return d->maxPlayers;
421 return QList<GameCVar>();
437 return (returnValue < 0) ? 0 : returnValue;
442 int returnValue = d->maxPlayers - d->players.numClients();
443 return (returnValue < 0) ? 0 : returnValue;
449 return (returnValue < 0) ? 0 : returnValue;
459 return d->players[index];
480 assert(0 &&
"Server::readRequest(const QByteArray&) is not implemented.");
486 d->bIsRefreshing =
true;
489 d->triesLeft = gConfig.doomseeker.querySpeed().attemptsPerServer;
491 d->triesLeft = qMin(d->triesLeft, QuerySpeed::MAX_ATTEMPTS_PER_SERVER);
493 d->triesLeft = qMax(d->triesLeft, 1);
498 d->lastRefreshClock.start();
499 setResponse(response);
503 d->ping = d->pingClock.elapsed();
504 d->bPingIsSet =
true;
506 d->bIsRefreshing =
false;
507 d->iwad = d->iwad.toLower();
508 emit
updated(
self(), response);
513 return d->scores[team];
518 return d->scoreLimit;
538 if (d->triesLeft <= 0)
546 if (request.isEmpty())
552 d->bPingIsSet =
false;
553 d->pingClock.start();
582 d->version = version;
585 void Server::setHostName(QHostInfo host)
588 if (!d->bIsRefreshing)
604 d->lockedInGame = locked;
614 d->mapName = mapName;
634 d->name = serverName;
636 d->name.replace(
'\n',
' ').replace(
'\r',
' ');
656 d->randomMapRotation = randomMapRotation;
659 void Server::setResponse(
Response response)
661 d->response = response;
672 void Server::setScores(
const QList<int> &
scores)
679 d->scoreLimit = serverScoreLimit;
684 d->bSecure = bSecure;
692 void Server::setTestingServer(
bool b)
694 d->testingServer = b;
699 d->timeLeft = serverTimeLeft;
704 d->timeLimit = serverTimeLimit;
712 void Server::setWads(
const QList<PWad> &
wads)
724 d->additionalWebSites = list;
731 case Player::TEAM_BLUE:
732 return qRgb(0, 0, 255);
733 case Player::TEAM_RED:
734 return qRgb(255, 0, 0);
735 case Player::TEAM_GREEN:
736 return qRgb(0, 255, 0);
737 case Player::TEAM_GOLD:
738 return qRgb(255, 255, 0);
741 return qRgb(0, 255, 0);
746 return team < MAX_TEAMS && team >= 0 ? teamNames[team] :
"";
761 if (d->lastRefreshClock.isValid())
763 return d->lastRefreshClock.elapsed();
783 return wads()[index];
798 QScopedPointer<ExeFile> exeFile(
clientExe());
817 return d->additionalWebSites;
832 void Server::setLan(
bool b)