Skip to content

Commit 11739e3

Browse files
committed
Don't mount externally downloaded addons
Also remove mm_mount_addon as it serves no purpose now
1 parent 64be017 commit 11739e3

File tree

1 file changed

+36
-27
lines changed

1 file changed

+36
-27
lines changed

src/multiaddonmanager.cpp

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "filesystem.h"
3030
#include "steam/steam_gameserver.h"
3131
#include <string>
32+
#include <sstream>
3233
#include "iserver.h"
3334

3435
#include "tier0/memdbgon.h"
@@ -60,7 +61,8 @@ void Panic(const char *msg, ...)
6061
}
6162

6263
std::string g_sExtraAddons;
63-
CUtlVector<char *> g_vecExtraAddons;
64+
CUtlVector<std::string> g_vecExtraAddons;
65+
CUtlVector<std::string> g_vecMountedAddons;
6466

6567
typedef void (FASTCALL *SendNetMessage_t)(INetChannel *pNetChan, INetworkSerializable *pNetMessage, void *pData, int a4);
6668
typedef void* (FASTCALL *HostStateRequest_t)(void *a1, void **pRequest);
@@ -167,7 +169,12 @@ bool MultiAddonManager::Load(PluginId id, ISmmAPI *ismm, char *error, size_t max
167169

168170
bool MultiAddonManager::Unload(char *error, size_t maxlen)
169171
{
170-
g_vecExtraAddons.PurgeAndDeleteElements();
172+
g_vecExtraAddons.Purge();
173+
174+
FOR_EACH_VEC_BACK(g_vecMountedAddons, i)
175+
UnmountAddon(g_vecMountedAddons[i].c_str());
176+
177+
g_vecMountedAddons.Purge();
171178

172179
SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, this, &MultiAddonManager::Hook_GameServerSteamAPIActivated, false);
173180
SH_REMOVE_HOOK_MEMFUNC(INetworkServerService, StartupServer, g_pNetworkServerService, this, &MultiAddonManager::Hook_StartupServer, true);
@@ -188,8 +195,6 @@ bool MultiAddonManager::Unload(char *error, size_t maxlen)
188195
return true;
189196
}
190197

191-
CUtlVector<std::string> g_vecMountedAddons;
192-
193198
void MultiAddonManager::BuildAddonPath(const char *pszAddon, char *buf, size_t len)
194199
{
195200
// The workshop is stored relative to the working directory for whatever reason
@@ -280,17 +285,17 @@ void MultiAddonManager::DownloadAddon(const char *pszAddon, bool bForce = false)
280285

281286
void MultiAddonManager::RefreshAddons()
282287
{
283-
Message("Refreshing addons (%s)\n", g_sExtraAddons);
288+
Message("Refreshing addons (%s)\n", g_sExtraAddons.c_str());
284289

285290
// Remove our paths first in case addons were switched
286291
FOR_EACH_VEC_BACK(g_vecMountedAddons, i)
287292
UnmountAddon(g_vecMountedAddons[i].c_str());
288293

289294
FOR_EACH_VEC(g_vecExtraAddons, i)
290295
{
291-
if (!MountAddon(g_vecExtraAddons[i]))
296+
if (!MountAddon(g_vecExtraAddons[i].c_str()))
292297
{
293-
DownloadAddon(g_vecExtraAddons[i]);
298+
DownloadAddon(g_vecExtraAddons[i].c_str());
294299
continue;
295300
}
296301
}
@@ -319,14 +324,30 @@ void MultiAddonManager::OnAddonDownloaded(DownloadItemResult_t *pResult)
319324

320325
std::string sAddon = std::to_string(pResult->m_nPublishedFileId);
321326

322-
if (g_vecMountedAddons.Find(sAddon) == -1)
327+
if (g_vecMountedAddons.Find(sAddon) == -1 && g_vecExtraAddons.Find(sAddon) != -1)
323328
{
324329
// Mount late downloaded addons to the tail so we don't inadvertently override packed map files
325330
// This will however place them below the game vpks as well, so any overrides won't work this way
326331
MountAddon(sAddon.c_str(), true);
327332
}
328333
}
329334

335+
void SplitStringToVector(const char *pszString, CUtlVector<std::string> &vector)
336+
{
337+
std::stringstream stream(pszString);
338+
339+
vector.RemoveAll();
340+
341+
while (stream.good())
342+
{
343+
std::string substr;
344+
getline(stream, substr, ',');
345+
346+
if (!substr.empty())
347+
vector.AddToTail(substr);
348+
}
349+
}
350+
330351
CON_COMMAND_F(mm_extra_addons, "The workshop IDs of extra addons separated by commas, addons will be downloaded (if not present) and mounted", FCVAR_LINKED_CONCOMMAND | FCVAR_SPONLY)
331352
{
332353
if (args.ArgC() < 2)
@@ -337,32 +358,20 @@ CON_COMMAND_F(mm_extra_addons, "The workshop IDs of extra addons separated by co
337358

338359
g_sExtraAddons = args[1];
339360

340-
g_vecExtraAddons.PurgeAndDeleteElements();
341-
V_SplitString(g_sExtraAddons.c_str(), ",", g_vecExtraAddons);
361+
SplitStringToVector(args[1], g_vecExtraAddons);
342362

343363
g_MultiAddonManager.RefreshAddons();
344364
}
345365

346-
CON_COMMAND_F(mm_download_addon, "Download and mount an addon manually (server only)", FCVAR_GAMEDLL | FCVAR_RELEASE | FCVAR_SPONLY)
366+
CON_COMMAND_F(mm_download_addon, "Download an addon manually", FCVAR_GAMEDLL | FCVAR_RELEASE | FCVAR_SPONLY)
347367
{
348368
if (args.ArgC() != 2)
349369
{
350370
Message("Usage: mm_download_addon <ID>\n");
351371
return;
352372
}
353373

354-
DownloadAddon(args[1], true);
355-
}
356-
357-
CON_COMMAND_F(mm_mount_addon, "Mount an addon manually (server only)", FCVAR_GAMEDLL | FCVAR_RELEASE | FCVAR_SPONLY)
358-
{
359-
if (args.ArgC() != 2)
360-
{
361-
Message("Usage: mm_mount_addon <ID>\n");
362-
return;
363-
}
364-
365-
MountAddon(args[1], true);
374+
g_MultiAddonManager.DownloadAddon(args[1], true);
366375
}
367376

368377
CON_COMMAND_F(mm_print_searchpaths, "Print search paths", FCVAR_GAMEDLL | FCVAR_RELEASE | FCVAR_SPONLY)
@@ -477,7 +486,7 @@ void FASTCALL Hook_SendNetMessage(INetChannel *pNetChan, INetworkSerializable *p
477486

478487
if (pPendingClient)
479488
{
480-
Message(__FUNCTION__": Sending addon %s to client %lli\n", g_vecExtraAddons[pPendingClient->addon], pPendingClient->steamid);
489+
Message(__FUNCTION__": Sending addon %s to client %lli\n", g_vecExtraAddons[pPendingClient->addon].c_str(), pPendingClient->steamid);
481490

482491
CNETMsg_SignonState *pMsg = (CNETMsg_SignonState *)pData;
483492
pMsg->set_addons(g_vecExtraAddons[pPendingClient->addon]);
@@ -529,7 +538,7 @@ bool MultiAddonManager::Hook_ClientConnect( CPlayerSlot slot, const char *pszNam
529538
if (!pPendingClient)
530539
{
531540
// Client joined for the first time or after a timeout
532-
Message("first connection, sending addon %s\n", g_vecExtraAddons[0]);
541+
Message("first connection, sending addon %s\n", g_vecExtraAddons[0].c_str());
533542
AddPendingClient(xuid);
534543
}
535544
else if ((Plat_FloatTime() - pPendingClient->signon_timestamp) < g_flRejoinTimeout)
@@ -540,7 +549,7 @@ bool MultiAddonManager::Hook_ClientConnect( CPlayerSlot slot, const char *pszNam
540549

541550
if (pPendingClient->addon < g_vecExtraAddons.Count())
542551
{
543-
Message("reconnected within the interval, sending next addon %s\n", g_vecExtraAddons[pPendingClient->addon]);
552+
Message("reconnected within the interval, sending next addon %s\n", g_vecExtraAddons[pPendingClient->addon].c_str());
544553
}
545554
else
546555
{
@@ -550,7 +559,7 @@ bool MultiAddonManager::Hook_ClientConnect( CPlayerSlot slot, const char *pszNam
550559
}
551560
else
552561
{
553-
Message("reconnected after the timeout or did not receive the addon message, will resend addon %s\n", g_vecExtraAddons[pPendingClient->addon]);
562+
Message("reconnected after the timeout or did not receive the addon message, will resend addon %s\n", g_vecExtraAddons[pPendingClient->addon].c_str());
554563
}
555564

556565
RETURN_META_VALUE(MRES_IGNORED, true);

0 commit comments

Comments
 (0)