[Script]: Load scripts from multiple dirs (#859)
This commit is contained in:
parent
65b095afcb
commit
9ff7dd81f5
@ -34,14 +34,14 @@ namespace Components
|
|||||||
bool Console::SkipShutdown = false;
|
bool Console::SkipShutdown = false;
|
||||||
|
|
||||||
COLORREF Console::TextColor =
|
COLORREF Console::TextColor =
|
||||||
#if _DEBUG
|
#ifdef _DEBUG
|
||||||
RGB(255, 200, 117);
|
RGB(255, 200, 117);
|
||||||
#else
|
#else
|
||||||
RGB(120, 237, 122);
|
RGB(120, 237, 122);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
COLORREF Console::BackgroundColor =
|
COLORREF Console::BackgroundColor =
|
||||||
#if _DEBUG
|
#ifdef _DEBUG
|
||||||
RGB(35, 21, 0);
|
RGB(35, 21, 0);
|
||||||
#else
|
#else
|
||||||
RGB(25, 32, 25);
|
RGB(25, 32, 25);
|
||||||
@ -383,6 +383,7 @@ namespace Components
|
|||||||
|
|
||||||
RefreshOutput();
|
RefreshOutput();
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
if (IsDebuggerPresent())
|
if (IsDebuggerPresent())
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
@ -390,6 +391,7 @@ namespace Components
|
|||||||
std::this_thread::sleep_for(5s);
|
std::this_thread::sleep_for(5s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TerminateProcess(GetCurrentProcess(), EXIT_FAILURE);
|
TerminateProcess(GetCurrentProcess(), EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -894,7 +896,7 @@ namespace Components
|
|||||||
Utils::Hook(0x64DC6B, 0x64DCC2, HOOK_JUMP).install()->quick();
|
Utils::Hook(0x64DC6B, 0x64DCC2, HOOK_JUMP).install()->quick();
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
Console::AddConsoleCommand();
|
AddConsoleCommand();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (Dedicated::IsEnabled() && !ZoneBuilder::IsEnabled())
|
if (Dedicated::IsEnabled() && !ZoneBuilder::IsEnabled())
|
||||||
|
@ -35,24 +35,23 @@ namespace Components::GSC
|
|||||||
Game::Scr_StartupGameType();
|
Game::Scr_StartupGameType();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not use C++ objects because Scr_LoadScript may longjmp
|
void Script::LoadCustomScriptsFromFolder(const char* dir)
|
||||||
void Script::GScr_LoadGameTypeScript_Stub()
|
|
||||||
{
|
{
|
||||||
// Clear handles (from previous GSC loading session)
|
char path[MAX_OSPATH]{};
|
||||||
ScriptMainHandles.clear();
|
char searchPath[MAX_OSPATH]{};
|
||||||
ScriptInitHandles.clear();
|
|
||||||
|
|
||||||
char path[MAX_PATH]{};
|
strncpy_s(searchPath, dir, _TRUNCATE);
|
||||||
|
strncat_s(searchPath, "/", _TRUNCATE);
|
||||||
|
|
||||||
auto numFiles = 0;
|
auto numFiles = 0;
|
||||||
const auto** files = Game::FS_ListFiles("scripts/", "gsc", Game::FS_LIST_ALL, &numFiles, 10);
|
const auto** files = Game::FS_ListFiles(searchPath, "gsc", Game::FS_LIST_ALL, &numFiles, 10);
|
||||||
|
|
||||||
for (auto i = 0; i < numFiles; ++i)
|
for (auto i = 0; i < numFiles; ++i)
|
||||||
{
|
{
|
||||||
const auto* scriptFile = files[i];
|
const auto* scriptFile = files[i];
|
||||||
Logger::Print("Loading script {}...\n", scriptFile);
|
Logger::Print("Loading script {}...\n", scriptFile);
|
||||||
|
|
||||||
const auto len = sprintf_s(path, "%s/%s", "scripts", scriptFile);
|
const auto len = sprintf_s(path, "%s/%s", dir, scriptFile);
|
||||||
if (len == -1)
|
if (len == -1)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@ -63,7 +62,7 @@ namespace Components::GSC
|
|||||||
|
|
||||||
if (!Game::Scr_LoadScript(path))
|
if (!Game::Scr_LoadScript(path))
|
||||||
{
|
{
|
||||||
Logger::Print("Script {} encountered an error while loading. (doesn't exist?)", path);
|
Logger::Print("Script {} encountered an error while loading. A compilation error is the most likely cause\n", path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,12 +71,14 @@ namespace Components::GSC
|
|||||||
const auto initHandle = Game::Scr_GetFunctionHandle(path, "init");
|
const auto initHandle = Game::Scr_GetFunctionHandle(path, "init");
|
||||||
if (initHandle != 0)
|
if (initHandle != 0)
|
||||||
{
|
{
|
||||||
|
Logger::Debug("Loaded '{}::init'", path);
|
||||||
ScriptInitHandles.insert_or_assign(path, initHandle);
|
ScriptInitHandles.insert_or_assign(path, initHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto mainHandle = Game::Scr_GetFunctionHandle(path, "main");
|
const auto mainHandle = Game::Scr_GetFunctionHandle(path, "main");
|
||||||
if (mainHandle != 0)
|
if (mainHandle != 0)
|
||||||
{
|
{
|
||||||
|
Logger::Debug("Loaded '{}::main'", path);
|
||||||
ScriptMainHandles.insert_or_assign(path, mainHandle);
|
ScriptMainHandles.insert_or_assign(path, mainHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,6 +86,34 @@ namespace Components::GSC
|
|||||||
}
|
}
|
||||||
|
|
||||||
Game::FS_FreeFileList(files, 10);
|
Game::FS_FreeFileList(files, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Script::LoadCustomScripts()
|
||||||
|
{
|
||||||
|
LoadCustomScriptsFromFolder("scripts");
|
||||||
|
|
||||||
|
// Game specific
|
||||||
|
const auto* gameDir = "scripts/mp";
|
||||||
|
LoadCustomScriptsFromFolder(gameDir);
|
||||||
|
|
||||||
|
// Map specific
|
||||||
|
const auto* mapDir = Utils::String::Format("scripts/mp/{}", (*Game::sv_mapname)->current.string);
|
||||||
|
LoadCustomScriptsFromFolder(mapDir);
|
||||||
|
|
||||||
|
// Mode specific
|
||||||
|
const auto modeDir = Utils::String::Format("scripts/mp/{}", (*Game::g_gametype)->current.string);
|
||||||
|
LoadCustomScriptsFromFolder(modeDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not use C++ objects because Scr_LoadScript may longjmp and crash or leak memory
|
||||||
|
void Script::GScr_LoadGameTypeScript_Stub()
|
||||||
|
{
|
||||||
|
// Clear handles (from previous GSC loading session)
|
||||||
|
ScriptMainHandles.clear();
|
||||||
|
ScriptInitHandles.clear();
|
||||||
|
|
||||||
|
LoadCustomScripts();
|
||||||
|
|
||||||
Game::GScr_LoadGameTypeScript();
|
Game::GScr_LoadGameTypeScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,9 @@ namespace Components::GSC
|
|||||||
static std::unordered_map<std::string, int> ScriptMainHandles;
|
static std::unordered_map<std::string, int> ScriptMainHandles;
|
||||||
static std::unordered_map<std::string, int> ScriptInitHandles;
|
static std::unordered_map<std::string, int> ScriptInitHandles;
|
||||||
|
|
||||||
|
static void LoadCustomScriptsFromFolder(const char* dir);
|
||||||
|
static void LoadCustomScripts();
|
||||||
|
|
||||||
static void Scr_LoadGameType_Stub();
|
static void Scr_LoadGameType_Stub();
|
||||||
static void Scr_StartupGameType_Stub();
|
static void Scr_StartupGameType_Stub();
|
||||||
static void GScr_LoadGameTypeScript_Stub();
|
static void GScr_LoadGameTypeScript_Stub();
|
||||||
|
Loading…
Reference in New Issue
Block a user