Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add plugin dependency constants #458

Merged
merged 12 commits into from
Dec 14, 2023
28 changes: 28 additions & 0 deletions NorthstarDLL/mods/modmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ Mod::Mod(fs::path modDir, char* jsonBuf)
ParseScripts(modJson);
ParseLocalization(modJson);
ParseDependencies(modJson);
ParsePluginDependencies(modJson);
ParseInitScript(modJson);

// A mod is remote if it's located in the remote mods folder
Expand Down Expand Up @@ -483,6 +484,28 @@ void Mod::ParseDependencies(rapidjson_document& json)
}
}

void Mod::ParsePluginDependencies(rapidjson_document& json)
{
if (!json.HasMember("PluginDependencies"))
return;

if (!json["PluginDependencies"].IsArray())
{
spdlog::warn("'PluginDependencies' field is not an object, skipping...");
return;
}

for (auto& name : json["PluginDependencies"].GetArray())
{
if (!name.IsString())
continue;

spdlog::info("Plugin Constant {} defined by {}", name.GetString(), Name);

PluginDependencyConstants.push_back(name.GetString());
}
}

void Mod::ParseInitScript(rapidjson_document& json)
{
if (!json.HasMember("InitScript"))
Expand Down Expand Up @@ -688,6 +711,11 @@ void ModManager::LoadMods()
m_DependencyConstants.emplace(pair);
}

for (std::string& dependency : mod.PluginDependencyConstants)
{
m_PluginDependencyConstants.insert(dependency);
}

if (m_bHasEnabledModsCfg && m_EnabledModsCfg.HasMember(mod.Name.c_str()))
mod.m_bEnabled = m_EnabledModsCfg[mod.Name.c_str()].IsTrue();
else
Expand Down
4 changes: 4 additions & 0 deletions NorthstarDLL/mods/modmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <string>
#include <vector>
#include <filesystem>
#include <unordered_set>

const std::string MOD_FOLDER_SUFFIX = "\\mods";
const std::string THUNDERSTORE_MOD_FOLDER_SUFFIX = "\\packages";
Expand Down Expand Up @@ -124,6 +125,7 @@ class Mod
// hashed with STR_HASH

std::unordered_map<std::string, std::string> DependencyConstants;
std::vector<std::string> PluginDependencyConstants;

public:
Mod(fs::path modPath, char* jsonBuf);
Expand All @@ -134,6 +136,7 @@ class Mod
void ParseScripts(rapidjson_document& json);
void ParseLocalization(rapidjson_document& json);
void ParseDependencies(rapidjson_document& json);
void ParsePluginDependencies(rapidjson_document& json);
void ParseInitScript(rapidjson_document& json);
};

Expand All @@ -160,6 +163,7 @@ class ModManager
std::vector<Mod> m_LoadedMods;
std::unordered_map<std::string, ModOverrideFile> m_ModFiles;
std::unordered_map<std::string, std::string> m_DependencyConstants;
std::unordered_set<std::string> m_PluginDependencyConstants;

public:
ModManager();
Expand Down
9 changes: 9 additions & 0 deletions NorthstarDLL/plugins/plugins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,15 @@ std::optional<Plugin> PluginManager::LoadPlugin(fs::path path, PluginInitFuncs*
plugin.dependencyName = plugin.name;
}

if (std::find_if(
plugin.dependencyName.begin(),
plugin.dependencyName.end(),
[&](char c) -> bool { return !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_'); }) !=
plugin.dependencyName.end())
{
NS::log::PLUGINSYS->warn("Dependency string \"{}\" in {} is not valid a squirrel constant!", plugin.dependencyName, plugin.name);
}

plugin.init_sqvm_client = (PLUGIN_INIT_SQVM_TYPE)GetProcAddress(pluginLib, "PLUGIN_INIT_SQVM_CLIENT");
plugin.init_sqvm_server = (PLUGIN_INIT_SQVM_TYPE)GetProcAddress(pluginLib, "PLUGIN_INIT_SQVM_SERVER");
plugin.inform_sqvm_created = (PLUGIN_INFORM_SQVM_CREATED_TYPE)GetProcAddress(pluginLib, "PLUGIN_INFORM_SQVM_CREATED");
Expand Down
7 changes: 7 additions & 0 deletions NorthstarDLL/squirrel/squirrel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,13 @@ template <ScriptContext context> void SquirrelManager<context>::VMCreated(CSquir
defconst(m_pSQVM, pair.first.c_str(), bWasFound);
}

auto loadedPlugins = &g_pPluginManager->m_vLoadedPlugins;
for (const auto& pluginName : g_pModManager->m_PluginDependencyConstants)
{
auto f = [&](Plugin plugin) -> bool { return plugin.dependencyName == pluginName; };
defconst(m_pSQVM, pluginName.c_str(), std::find_if(loadedPlugins->begin(), loadedPlugins->end(), f) != loadedPlugins->end());
pg9182 marked this conversation as resolved.
Show resolved Hide resolved
}

defconst(m_pSQVM, "MAX_FOLDER_SIZE", GetMaxSaveFolderSize() / 1024);

// define squirrel constants for northstar(.dll) version
Expand Down