Read gsc rawfiles

This commit is contained in:
Federico Cecchetto 2022-08-27 17:36:49 +02:00
parent e08791440d
commit 94ce2e4dac
2 changed files with 66 additions and 21 deletions

View File

@ -9,6 +9,7 @@
#include "scripting.hpp"
#include "gsc.hpp"
#include "scheduler.hpp"
#include "fastfiles.hpp"
#include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
@ -48,6 +49,30 @@ namespace gsc
return utils::hook::invoke<char*>(0x14061E680, size, 4, 1, 5);
}
bool read_scriptfile(const std::string& name, std::string* data)
{
if (filesystem::read_file(name, data))
{
return true;
}
const auto asset = game::DB_FindXAssetHeader(game::ASSET_TYPE_RAWFILE, name.data(), false);
if (asset.rawfile)
{
const auto len = game::DB_GetRawFileLen(asset.rawfile);
data->resize(len);
game::DB_GetRawBuffer(asset.rawfile, data->data(), len);
if (len > 0)
{
data->pop_back();
}
return true;
}
return false;
}
game::ScriptFile* load_custom_script(const char* file_name, const std::string& real_name)
{
if (loaded_scripts.find(real_name) != loaded_scripts.end())
@ -56,7 +81,7 @@ namespace gsc
}
std::string source_buffer{};
if (!filesystem::read_file(real_name + ".gsc", &source_buffer))
if (!read_scriptfile(real_name + ".gsc", &source_buffer))
{
return nullptr;
}
@ -104,6 +129,30 @@ namespace gsc
return script_file_ptr;
}
void load_script(const std::string& name)
{
if (!game::Scr_LoadScript(name.data()))
{
return;
}
const auto main_handle = game::Scr_GetFunctionHandle(name.data(),
xsk::gsc::h2::resolver::token_id("main"));
const auto init_handle = game::Scr_GetFunctionHandle(name.data(),
xsk::gsc::h2::resolver::token_id("init"));
if (main_handle)
{
console::info("Loaded '%s::main'\n", name.data());
main_handles[name] = main_handle;
}
else if (init_handle)
{
console::info("Loaded '%s::init'\n", name.data());
init_handles[name] = init_handle;
}
}
void load_scripts(const std::filesystem::path& root_dir)
{
std::filesystem::path script_dir = root_dir / "scripts";
@ -124,26 +173,7 @@ namespace gsc
const auto relative = path.lexically_relative(root_dir).generic_string();
const auto base_name = relative.substr(0, relative.size() - 4);
if (!game::Scr_LoadScript(base_name.data()))
{
continue;
}
const auto main_handle = game::Scr_GetFunctionHandle(base_name.data(),
xsk::gsc::h2::resolver::token_id("main"));
const auto init_handle = game::Scr_GetFunctionHandle(base_name.data(),
xsk::gsc::h2::resolver::token_id("init"));
if (main_handle)
{
console::info("Loaded '%s::main'\n", base_name.data());
main_handles[base_name] = main_handle;
}
else if (init_handle)
{
console::info("Loaded '%s::init'\n", base_name.data());
init_handles[base_name] = init_handle;
}
load_script(base_name);
}
}
@ -175,6 +205,17 @@ namespace gsc
clear();
fastfiles::enum_assets(game::ASSET_TYPE_RAWFILE, [](game::XAssetHeader header)
{
std::string name = header.scriptfile->name;
if (name.ends_with(".gsc") && name.starts_with("scripts/"))
{
const auto base_name = name.substr(0, name.size() - 4);
load_script(base_name);
}
}, true);
for (const auto& path : filesystem::get_search_paths())
{
load_scripts(path);

View File

@ -2109,5 +2109,9 @@ namespace scripting
{"script_team", 31474},
{"script_ai_invulnerable", 31024},
{"script_mp_style_helicopter", 31353},
{"script_startingposition", 31455},
{"script_vehicle_selfremove", 31507},
{"script_stopnode", 31464},
{"script_unload", 31497},
};
}