24 #include "datapaths.h"
25 #include "gui/configuration/engineconfigpage.h"
27 #include "irc/entities/ircnetworkentity.h"
29 #include "pathfinder/pathfind.h"
30 #include "plugins/enginedefaults.h"
31 #include "plugins/engineplugin.h"
32 #include "serverapi/gameexefactory.h"
33 #include "serverapi/gamefile.h"
34 #include "serverapi/gamehost.h"
35 #include "serverapi/server.h"
36 #include "strings.hpp"
40 #include <QRegularExpression>
42 EnginePlugin::Data::Data()
45 allowsConnectPassword =
false;
46 allowsClientSlots =
true;
47 allowsPlayerSlots =
true;
49 allowsJoinPassword =
false;
51 allowsRConPassword =
false;
54 allowsUpnpPort =
false;
55 allowsLogging =
false;
59 defaultServerPort = 10666;
60 demoExtensionAutomatic =
true;
61 demoExtension =
"lmp";
65 inGameFileDownloads =
false;
66 masterClient =
nullptr;
69 supportsRandomMapRotation =
false;
77 EnginePlugin::EnginePlugin()
86 d->abiVersion = DOOMSEEKER_ABI_VERSION;
89 EnginePlugin::~EnginePlugin()
108 return QList<DMFlagsSection>();
123 return QList<GameMode>();
128 return QList<GameCVar>();
134 d->
icon =
new QPixmap(icon);
135 d->scheme = QString(d->name).replace(
' ',
"");
141 while ((feature = va_arg(va,
int)) !=
EP_Done)
147 gLog << QString(
"%1 plugin attempted to use unknown feature.").arg(name);
152 d->author = va_arg(va,
const char *);
155 d->version = va_arg(va,
unsigned int);
162 d->allowsConnectPassword =
true;
165 d->allowsEmail =
true;
171 d->allowsJoinPassword =
true;
174 d->allowsLogging =
true;
177 d->allowsRConPassword =
true;
180 d->allowsMOTD =
true;
183 d->allowsUpnp =
true;
186 d->allowsUpnpPort =
true;
192 d->canonicalName = va_arg(va,
const char *);
195 d->clientOnly =
true;
201 d->defaultServerPort = va_arg(va,
unsigned int);
204 d->demoExtensionAutomatic = va_arg(va,
unsigned int);
205 d->demoExtension = va_arg(va,
const char *);
214 d->inGameFileDownloads =
true;
220 entity.setDescription(va_arg(va,
const char *));
221 entity.setAddress(va_arg(va,
const char *));
224 if (d->ircChannels.contains(entity))
226 IRCNetworkEntity &existingEntity = d->ircChannels[d->ircChannels.indexOf(entity)];
230 d->ircChannels << entity;
237 d->allowsClientSlots =
false;
240 d->allowsPlayerSlots =
false;
246 d->hasMapList =
false;
249 d->supportsRandomMapRotation =
true;
252 d->scheme = va_arg(va,
const char *);
255 d->refreshThreshold = va_arg(va,
unsigned int);
258 d->clientExeName = va_arg(va,
const char *);
261 d->serverExeName = va_arg(va,
const char *);
265 QString suffixes = va_arg(va,
const char *);
266 d->gameFileSearchSuffixes = suffixes.split(
";", Qt::SkipEmptyParts);
277 QString str = d->pConfig->
setting(
"Masterserver");
283 if (!d->canonicalName.isEmpty())
285 return d->canonicalName;
290 QString name = data()->name;
291 name = name.toLower();
292 name = name.replace(QRegularExpression(
"\\s"),
"_");
300 if (server !=
nullptr)
301 server->setSelf(server.toWeakRef());
320 void EnginePlugin::setGameExeFactory(QSharedPointer<GameExeFactory> factory)
325 void EnginePlugin::findGameFiles(
IniSection &ini)
327 for (
const GameFile &file : gameExe()->gameFiles().asQList())
331 QString path = PathFind::findGameFile(collectKnownPaths(ini), file);
332 ini[file.
configName()] = gDefaultDataPaths->portablizePath(path);
337 QStringList EnginePlugin::collectKnownPaths(
const IniSection &ini)
const
340 for (
const GameFile &file : data()->gameExeFactory->gameFiles().asQList())