wasted a day working on something that didn't end up working, rework some modloader code

This commit is contained in:
BobTheBob 2021-07-25 04:43:11 +01:00
parent 844e124034
commit 153e7f564c
5 changed files with 52 additions and 21 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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
}

View File

@ -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);
}

View File

@ -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