diff options
-rw-r--r-- | NorthstarDedicatedTest/modmanager.cpp | 34 | ||||
-rw-r--r-- | NorthstarDedicatedTest/modmanager.h | 4 | ||||
-rw-r--r-- | NorthstarDedicatedTest/scriptsrson.cpp | 8 | ||||
-rw-r--r-- | NorthstarDedicatedTest/squirrel.cpp | 14 | ||||
-rw-r--r-- | NorthstarDedicatedTest/squirrel.h | 13 |
5 files changed, 52 insertions, 21 deletions
diff --git a/NorthstarDedicatedTest/modmanager.cpp b/NorthstarDedicatedTest/modmanager.cpp index 05974d4e..66fff17f 100644 --- a/NorthstarDedicatedTest/modmanager.cpp +++ b/NorthstarDedicatedTest/modmanager.cpp @@ -68,6 +68,14 @@ Mod::Mod(fs::path modDir, char* jsonBuf) else RequiredOnClient = false; + if (modJson.HasMember("LoadPriority")) + LoadPriority = modJson["LoadPriority"].GetInt(); + else + { + spdlog::info("Mod file {} is missing a LoadPriority, consider adding one", (modDir / "mod.json").string()); + LoadPriority = 0; + } + // mod convars if (modJson.HasMember("ConVars") && modJson["ConVars"].IsArray()) { @@ -171,6 +179,9 @@ ModManager::ModManager() void ModManager::LoadMods() { // this needs better support for reloads + + // do we need to dealloc individual entries in m_loadedMods? idk, rework + m_loadedMods.clear(); std::vector<fs::path> modDirs; @@ -211,8 +222,14 @@ void ModManager::LoadMods() } } + // sort by load prio, lowest-highest + std::sort(m_loadedMods.begin(), m_loadedMods.end(), [](Mod* a, Mod* b) { + return a->LoadPriority > b->LoadPriority; + }); + // do we need to dealloc individual entries in m_modFiles? idk, rework m_modFiles.clear(); + fs::remove_all(COMPILED_ASSETS_PATH); for (Mod* mod : m_loadedMods) { @@ -222,25 +239,26 @@ void ModManager::LoadMods() for (ModConVar* convar : mod->ConVars) if (g_CustomConvars.find(convar->Name) == g_CustomConvars.end()) // make sure convar isn't registered yet, unsure if necessary but idk what behaviour is for defining same convar multiple times RegisterConVar(convar->Name.c_str(), convar->DefaultValue.c_str(), convar->Flags, convar->HelpString.c_str()); - - - // register mod files - if (fs::exists(mod->ModDirectory / MOD_OVERRIDE_DIR)) + } + + // in a seperate loop because we register mod files in reverse order, since mods loaded later should have their files prioritised + for (int i = m_loadedMods.size() - 1; i > -1; i--) + { + if (fs::exists(m_loadedMods[i]->ModDirectory / MOD_OVERRIDE_DIR)) { - for (fs::directory_entry file : fs::recursive_directory_iterator(mod->ModDirectory / MOD_OVERRIDE_DIR)) + for (fs::directory_entry file : fs::recursive_directory_iterator(m_loadedMods[i]->ModDirectory / MOD_OVERRIDE_DIR)) { if (file.is_regular_file()) { // super temp because it relies hard on load order ModOverrideFile* modFile = new ModOverrideFile; - modFile->owningMod = mod; - modFile->path = file.path().lexically_relative(mod->ModDirectory / MOD_OVERRIDE_DIR).lexically_normal(); + modFile->owningMod = m_loadedMods[i]; + modFile->path = file.path().lexically_relative(m_loadedMods[i]->ModDirectory / MOD_OVERRIDE_DIR).lexically_normal(); m_modFiles.push_back(modFile); } } } } - } void ModManager::CompileAssetsForFile(const char* filename) diff --git a/NorthstarDedicatedTest/modmanager.h b/NorthstarDedicatedTest/modmanager.h index 662c34c4..78b3153c 100644 --- a/NorthstarDedicatedTest/modmanager.h +++ b/NorthstarDedicatedTest/modmanager.h @@ -59,7 +59,9 @@ public: std::string DownloadLink; // whether clients need the mod to join servers running this mod - bool RequiredOnClient = true; + bool RequiredOnClient; + // the priority for this mod's files, mods with prio 0 are loaded first, then 1, then 2, etc + int LoadPriority; // custom scripts used by the mod std::vector<ModScript*> Scripts; diff --git a/NorthstarDedicatedTest/scriptsrson.cpp b/NorthstarDedicatedTest/scriptsrson.cpp index 05386910..1f08e7f1 100644 --- a/NorthstarDedicatedTest/scriptsrson.cpp +++ b/NorthstarDedicatedTest/scriptsrson.cpp @@ -2,6 +2,7 @@ #include "modmanager.h" #include "scriptsrson.h" #include "filesystem.h" +#include "squirrel.h" #include <sstream> #include <fstream> @@ -21,11 +22,11 @@ void ModManager::BuildScriptsRson() { for (ModScript* script : mod->Scripts) { - /* should create something with the format + /* should create something with this format for each script When: "CONTEXT" Scripts: [ - "_coolscript.gnut" + _coolscript.gnut ]*/ scriptsRson += "When: \""; @@ -48,4 +49,7 @@ void ModManager::BuildScriptsRson() overrideFile->owningMod = nullptr; overrideFile->path = "scripts/vscripts/scripts.rson"; m_modFiles.push_back(overrideFile); + + // todo: for preventing dupe scripts in scripts.rson, we could actually parse when conditions with the squirrel vm, just need a way to get a result out of squirrelmanager.ExecuteCode + // this would probably be the best way to do this, imo }
\ No newline at end of file diff --git a/NorthstarDedicatedTest/squirrel.cpp b/NorthstarDedicatedTest/squirrel.cpp index 4462eb7f..d999ef0d 100644 --- a/NorthstarDedicatedTest/squirrel.cpp +++ b/NorthstarDedicatedTest/squirrel.cpp @@ -123,14 +123,14 @@ template<Context context> void* CreateNewVMHook(void* a1, Context realContext) sqvm = ClientCreateNewVM(a1, realContext); if (realContext == UI) - g_UISquirrelManager->sqvm = sqvm; + g_UISquirrelManager->VMCreated(sqvm); else - g_ClientSquirrelManager->sqvm = sqvm; + g_ClientSquirrelManager->VMCreated(sqvm) } else if (context == SERVER) { sqvm = ServerCreateNewVM(a1, context); - g_ServerSquirrelManager->sqvm = sqvm; + g_ServerSquirrelManager->VMCreated(sqvm); } spdlog::info("CreateNewVM {} {}", GetContextName(realContext), sqvm); @@ -144,18 +144,18 @@ template<Context context> void DestroyVMHook(void* a1, void* sqvm) if (context == CLIENT) { if (g_ClientSquirrelManager->sqvm == sqvm) - g_ClientSquirrelManager->sqvm = nullptr; + g_ClientSquirrelManager->VMDestroyed(); else if (g_UISquirrelManager->sqvm == sqvm) { - g_UISquirrelManager->sqvm = nullptr; - realContext == UI; + g_UISquirrelManager->VMDestroyed(); + realContext = UI; } ClientDestroyVM(a1, sqvm); } else if (context == SERVER) { - g_ServerSquirrelManager->sqvm = nullptr; + g_ServerSquirrelManager->VMDestroyed(); ServerDestroyVM(a1, sqvm); } diff --git a/NorthstarDedicatedTest/squirrel.h b/NorthstarDedicatedTest/squirrel.h index bb377604..43f6cef8 100644 --- a/NorthstarDedicatedTest/squirrel.h +++ b/NorthstarDedicatedTest/squirrel.h @@ -44,9 +44,6 @@ typedef SQInteger(*SQFunction)(void* sqvm); template<Context context> class SquirrelManager { -private: - //std::vector< - public: void* sqvm; @@ -54,6 +51,16 @@ public: SquirrelManager() : sqvm(nullptr) {} + void VMCreated(void* sqvm) + { + sqvm = sqvm; + } + + void VMDestroyed() + { + sqvm = nullptr; + } + void ExecuteCode(const char* code) { // ttf2sdk checks ThreadIsInMainThread here, might be good to do that? doesn't seem like an issue rn tho |