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";
62 multiplayerDemoExtensionAutomatic =
true;
63 multiplayerDemoExtension =
"lmp";
67 inGameFileDownloads =
false;
68 masterClient =
nullptr;
71 supportsRandomMapRotation =
false;
79 EnginePlugin::EnginePlugin()
88 d->abiVersion = DOOMSEEKER_ABI_VERSION;
91 EnginePlugin::~EnginePlugin()
110 return QList<DMFlagsSection>();
125 return QList<GameMode>();
130 return QList<GameCVar>();
136 d->
icon =
new QPixmap(icon);
137 d->scheme = QString(d->name).replace(
' ',
"");
143 while ((feature = va_arg(va,
int)) !=
EP_Done)
149 gLog << QString(
"%1 plugin attempted to use unknown feature.").arg(name);
154 d->author = va_arg(va,
const char *);
157 d->version = va_arg(va,
unsigned int);
164 d->allowsConnectPassword =
true;
167 d->allowsEmail =
true;
173 d->allowsJoinPassword =
true;
176 d->allowsLogging =
true;
179 d->allowsRConPassword =
true;
182 d->allowsMOTD =
true;
185 d->allowsUpnp =
true;
188 d->allowsUpnpPort =
true;
194 d->canonicalName = va_arg(va,
const char *);
197 d->clientOnly =
true;
203 d->defaultServerPort = va_arg(va,
unsigned int);
206 d->demoExtensionAutomatic = va_arg(va,
unsigned int);
207 d->demoExtension = va_arg(va,
const char *);
210 d->multiplayerDemoExtensionAutomatic = va_arg(va,
unsigned int);
211 d->multiplayerDemoExtension = va_arg(va,
const char *);
220 d->inGameFileDownloads =
true;
226 entity.setDescription(va_arg(va,
const char *));
227 entity.setAddress(va_arg(va,
const char *));
230 if (d->ircChannels.contains(entity))
232 IRCNetworkEntity &existingEntity = d->ircChannels[d->ircChannels.indexOf(entity)];
236 d->ircChannels << entity;
243 d->allowsClientSlots =
false;
246 d->allowsPlayerSlots =
false;
252 d->hasMapList =
false;
255 d->supportsRandomMapRotation =
true;
258 d->scheme = va_arg(va,
const char *);
261 d->refreshThreshold = va_arg(va,
unsigned int);
264 d->clientExeName = va_arg(va,
const char *);
267 d->serverExeName = va_arg(va,
const char *);
271 QString suffixes = va_arg(va,
const char *);
272 d->gameFileSearchSuffixes = suffixes.split(
";", Qt::SkipEmptyParts);
280 if (d->canonicalName.isEmpty())
284 QString canonicalName(data()->name);
285 d->canonicalName = canonicalName
287 .replace(QRegularExpression(
"\\s"),
"_");
293 QString str = d->pConfig->
setting(
"Masterserver");
299 return d->canonicalName;
305 if (server !=
nullptr)
306 server->setSelf(server.toWeakRef());
325 void EnginePlugin::setGameExeFactory(QSharedPointer<GameExeFactory> factory)
330 void EnginePlugin::findGameFiles(
IniSection &ini)
332 for (
const GameFile &file : gameExe()->gameFiles().asQList())
336 QString path = PathFind::findGameFile(collectKnownPaths(ini), file);
337 ini[file.
configName()] = gDefaultDataPaths->portablizePath(path);
342 QStringList EnginePlugin::collectKnownPaths(
const IniSection &ini)
const
345 for (
const GameFile &file : data()->gameExeFactory->gameFiles().asQList())