Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion BG3Extender/Extender/Client/ExtensionStateClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ class ExtensionState : public ExtensionStateBase

void OnInputEvent(SDL_Event* event, int& result);

inline char const * GetUnconditionalFileName() override
{
return "OverrideClient.lua";
}

protected:
friend LuaStatePin<ExtensionState, lua::ClientState>;
std::unique_ptr<lua::ClientState> Lua;
Expand All @@ -48,4 +53,4 @@ class ExtensionState : public ExtensionStateBase
void FireInputEvents();
};

END_NS()
END_NS()
7 changes: 6 additions & 1 deletion BG3Extender/Extender/Server/ExtensionStateServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ namespace bg3se::esv
return "BootstrapServer.lua";
}

inline char const * GetUnconditionalFileName() override
{
return "OverrideServer.lua";
}

inline std::unordered_set<FixedString> const& GetPersistentStats() const
{
return persistentStats_;
Expand Down Expand Up @@ -63,4 +68,4 @@ namespace bg3se::esv
void DoLuaReset() override;
void LuaStartup() override;
};
}
}
73 changes: 69 additions & 4 deletions BG3Extender/Extender/Shared/ExtensionState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,21 @@ namespace bg3se
return;
}

std::unordered_set<FixedString> mods;

auto isLoaded = [&mods, &modManager](const Module& mod){
if (mods.size() == 0)
{
for (const Module& mod : modManager->BaseModule.LoadOrderedModules)
{
mods.emplace(mod.Info.ModuleUUIDString);
}
}
return mods.contains(mod.Info.ModuleUUIDString);
};

unsigned numConfigs{ 0 };
for (auto const& mod : modManager->LoadOrderedModules) {
for (auto const& mod : modManager->AvailableMods) {
auto dir = mod.Info.Directory;
auto configFile = "Mods/" + dir + "/ScriptExtender/Config.json";
auto reader = GetStaticSymbols().MakeFileReader(configFile);
Expand Down Expand Up @@ -82,6 +95,8 @@ namespace bg3se
continue;
}

config.IsLoaded = isLoaded(mod);

if (config.MinimumVersion > CurrentVersion) {
OsiError("Module '" << mod.Info.Name << " is targeting version v" << config.MinimumVersion << " that's more recent than the current version!");
}
Expand Down Expand Up @@ -524,7 +539,7 @@ namespace bg3se
}

lua::Restriction restriction(*lua, lua::State::RestrictAll);
for (auto const& mod : modManager->LoadOrderedModules) {
for (auto const& mod : modManager->AvailableMods) {
auto configIt = modConfigs_.find(mod.Info.ModuleUUIDString);
if (configIt != modConfigs_.end()) {
auto const & config = configIt->second;
Expand All @@ -536,9 +551,17 @@ namespace bg3se
}

if (context_ == ExtensionStateContext::Game) {
LuaLoadGameBootstrap(config, mod);
LuaLoadGameUnconditional(config, mod);
if (config.IsLoaded)
{
LuaLoadGameBootstrap(config, mod);
}
} else if (context_ == ExtensionStateContext::Load) {
LuaLoadPreinitBootstrap(config, mod);
LuaLoadPreinitUnconditional(config, mod);
if (config.IsLoaded)
{
LuaLoadPreinitBootstrap(config, mod);
}
} else {
ERR("Bootstrap request with Uninitialized extension context?");
}
Expand All @@ -549,6 +572,48 @@ namespace bg3se
lua->FinishStartup();
}

void ExtensionStateBase::LuaLoadPreinitUnconditional(ExtensionModConfig const& config, Module const& mod)
{
auto bootstrapFileName = "OverrideModule.lua";
auto const& sym = GetStaticSymbols();

auto path = ResolveModScriptPath(mod, bootstrapFileName);
if (!sym.FileExists(path)) {
return;
}

LuaVirtualPin lua(*this);
auto L = lua->GetState();
lua::push(L, mod.Info.ModuleUUID);
lua_setglobal(L, "ModuleUUID");

OsiMsg("Loading preinit override script: " << path);
lua->LoadBootstrap(bootstrapFileName, config.ModTable);

lua::push(L, nullptr);
lua_setglobal(L, "ModuleUUID");
}

void ExtensionStateBase::LuaLoadGameUnconditional(ExtensionModConfig const& config, Module const& mod)
{
auto bootstrapFileName = GetUnconditionalFileName();
auto const& sym = GetStaticSymbols();

auto bootstrapPath = ResolveModScriptPath(mod, bootstrapFileName);
if (!bootstrapPath.empty() && sym.FileExists(bootstrapPath)) {
LuaVirtualPin lua(*this);
auto L = lua->GetState();
lua::push(L, mod.Info.ModuleUUIDString);
lua_setglobal(L, "ModuleUUID");

OsiMsg("Loading override script: " << bootstrapPath);
lua->LoadBootstrap(bootstrapFileName, config.ModTable);

lua::push(L, nullptr);
lua_setglobal(L, "ModuleUUID");
}
}

void ExtensionStateBase::LuaLoadGameBootstrap(ExtensionModConfig const& config, Module const& mod)
{
auto bootstrapFileName = GetBootstrapFileName();
Expand Down
9 changes: 7 additions & 2 deletions BG3Extender/Extender/Shared/ExtensionState.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ namespace bg3se
// Name to use in Lua Mods global table (>= v43)
STDString ModTable;
std::unordered_set<STDString> FeatureFlags;

bool IsLoaded;
};

enum class ExtensionStateContext
Expand Down Expand Up @@ -46,8 +48,9 @@ namespace bg3se
virtual void Reset();
virtual lua::State * GetLua() = 0;
virtual ModManager * GetModManager() = 0;
virtual LevelManager* GetLevelManager() = 0;
virtual LevelManager * GetLevelManager() = 0;
virtual char const * GetBootstrapFileName() = 0;
virtual char const * GetUnconditionalFileName() = 0;

void LoadConfigs();
bool LoadConfig(Module const & mod, STDString const & configText, ExtensionModConfig & config);
Expand Down Expand Up @@ -153,6 +156,8 @@ namespace bg3se
void LuaResetInternal();
virtual void DoLuaReset() = 0;
virtual void LuaStartup();
void LuaLoadPreinitUnconditional(ExtensionModConfig const& config, Module const& mod);
void LuaLoadGameUnconditional(ExtensionModConfig const& config, Module const& mod);
void LuaLoadGameBootstrap(ExtensionModConfig const& config, Module const& mod);
void LuaLoadPreinitBootstrap(ExtensionModConfig const& config, Module const& mod);
};
Expand Down Expand Up @@ -262,4 +267,4 @@ namespace bg3se
T & state_;
};

}
}
4 changes: 2 additions & 2 deletions BG3Extender/Extender/Shared/StatLoadOrderHelper.inl
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ void StatLoadOrderHelper::UpdateModDirectoryMap()

auto modManager = gExtender->GetCurrentExtensionState()->GetModManager();
if (modManager) {
for (auto const& mod : modManager->LoadOrderedModules) {
modDirectoryToModMap_.insert(std::make_pair(mod.Info.Directory, mod.Info.ModuleUUIDString));
for (auto const& mod : modManager->AvailableMods) {
modDirectoryToModMap_.insert(std::make_pair(mod.Info.Directory, mod.Info.ModuleUUIDString));
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions BG3Extender/Extender/Shared/UserVariables.inl
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,7 @@ void ModVariableManager::OnSessionLoading()
auto modManager = isServer_ ? GetStaticSymbols().GetModManagerServer() : GetStaticSymbols().GetModManagerClient();
if (modManager != nullptr) {
uint32_t nextIndex{ 0 };
for (auto const& mod : modManager->LoadOrderedModules) {
for (auto const& mod : modManager->AvailableMods) {
modIndices_.set(mod.Info.ModuleUUID, nextIndex++);
}
} else {
Expand Down Expand Up @@ -1291,9 +1291,9 @@ CachedModVariableManager::~CachedModVariableManager()
Guid CachedModVariableManager::ModIndexToGuid(uint32_t modIndex)
{
if (isServer_) {
return GetStaticSymbols().GetModManagerServer()->LoadOrderedModules[modIndex].Info.ModuleUUID;
return GetStaticSymbols().GetModManagerServer()->AvailableMods[modIndex].Info.ModuleUUID;
} else {
return GetStaticSymbols().GetModManagerClient()->LoadOrderedModules[modIndex].Info.ModuleUUID;
return GetStaticSymbols().GetModManagerClient()->AvailableMods[modIndex].Info.ModuleUUID;
}
}

Expand Down
6 changes: 6 additions & 0 deletions BG3Extender/GameDefinitions/GameHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,12 @@ namespace bg3se
}
}

for (auto const& mod : AvailableMods) {
if (mod.Info.ModuleUUIDString == modUuidFS) {
return &mod;
}
}

return nullptr;
}

Expand Down
48 changes: 46 additions & 2 deletions BG3Extender/Lua/Libs/Mod.inl
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,48 @@ bool IsModLoaded(lua_State* L, FixedString modNameGuid)
return false;
}

/// <summary>
/// Returns whether the module with the specified GUID is available, i.e. in the mod directory.
///
/// Example:
/// ```lua
/// if (Ext.IsModAvailable("5cc23efe-f451-c414-117d-b68fbc53d32d")) then
/// Ext.Print("Mod available")
/// end
/// ```
/// </summary>
/// <param name="modNameGuid">UUID of mod to check</param>
bool IsModAvailable(char const* modNameGuid)
{
auto modUuid = Guid::Parse(modNameGuid);
if (modUuid) {
auto modManager = gExtender->GetCurrentExtensionState()->GetModManager();
for (auto const& mod : modManager->AvailableMods) {
if (mod.Info.ModuleUUID == *modUuid) {
return true;
}
}
}

return false;
}

/// <summary>
/// Returns the list of available module UUIDs.
/// </summary>
/// <returns></returns>
ObjectSet<Guid> GetAvailableMods()
{
ObjectSet<Guid> mods;
auto modManager = gExtender->GetCurrentExtensionState()->GetModManager();

for (auto const& mod : modManager->AvailableMods) {
mods.Add(mod.Info.ModuleUUID);
}

return mods;
}

/// <summary>
/// Returns the list of loaded module UUIDs in the order they're loaded in.
/// </summary>
Expand All @@ -52,7 +94,7 @@ Array<FixedString> GetLoadOrder(lua_State* L)
}

/// <summary>
/// Returns detailed information about the specified (loaded) module.
/// Returns detailed information about the specified (available) module.
/// </summary>
/// <param name="modNameGuid">Mod UUID to query</param>
Module* GetMod(lua_State* L, FixedString modNameGuid)
Expand All @@ -61,7 +103,7 @@ Module* GetMod(lua_State* L, FixedString modNameGuid)

auto modUuid = Guid::Parse(modNameGuid.GetStringView());
if (modUuid) {
for (auto& mod : modManager->LoadOrderedModules) {
for (auto& mod : modManager->AvailableMods) {
if (mod.Info.ModuleUUID == *modUuid) {
return &mod;
}
Expand Down Expand Up @@ -92,7 +134,9 @@ void RegisterModLib()
DECLARE_MODULE(Mod, Both)
BEGIN_MODULE()
MODULE_FUNCTION(IsModLoaded)
MODULE_FUNCTION(IsModAvailable)
MODULE_FUNCTION(GetLoadOrder)
MODULE_FUNCTION(GetAvailableMods)
MODULE_FUNCTION(GetMod)
MODULE_FUNCTION(GetBaseMod)
MODULE_FUNCTION(GetModManager)
Expand Down