Read gsc rawfiles
This commit is contained in:
parent
e08791440d
commit
94ce2e4dac
@ -9,6 +9,7 @@
|
|||||||
#include "scripting.hpp"
|
#include "scripting.hpp"
|
||||||
#include "gsc.hpp"
|
#include "gsc.hpp"
|
||||||
#include "scheduler.hpp"
|
#include "scheduler.hpp"
|
||||||
|
#include "fastfiles.hpp"
|
||||||
|
|
||||||
#include "game/scripting/execution.hpp"
|
#include "game/scripting/execution.hpp"
|
||||||
#include "game/scripting/functions.hpp"
|
#include "game/scripting/functions.hpp"
|
||||||
@ -48,6 +49,30 @@ namespace gsc
|
|||||||
return utils::hook::invoke<char*>(0x14061E680, size, 4, 1, 5);
|
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)
|
game::ScriptFile* load_custom_script(const char* file_name, const std::string& real_name)
|
||||||
{
|
{
|
||||||
if (loaded_scripts.find(real_name) != loaded_scripts.end())
|
if (loaded_scripts.find(real_name) != loaded_scripts.end())
|
||||||
@ -56,7 +81,7 @@ namespace gsc
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string source_buffer{};
|
std::string source_buffer{};
|
||||||
if (!filesystem::read_file(real_name + ".gsc", &source_buffer))
|
if (!read_scriptfile(real_name + ".gsc", &source_buffer))
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -104,6 +129,30 @@ namespace gsc
|
|||||||
return script_file_ptr;
|
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)
|
void load_scripts(const std::filesystem::path& root_dir)
|
||||||
{
|
{
|
||||||
std::filesystem::path script_dir = root_dir / "scripts";
|
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 relative = path.lexically_relative(root_dir).generic_string();
|
||||||
const auto base_name = relative.substr(0, relative.size() - 4);
|
const auto base_name = relative.substr(0, relative.size() - 4);
|
||||||
|
|
||||||
if (!game::Scr_LoadScript(base_name.data()))
|
load_script(base_name);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,6 +205,17 @@ namespace gsc
|
|||||||
|
|
||||||
clear();
|
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())
|
for (const auto& path : filesystem::get_search_paths())
|
||||||
{
|
{
|
||||||
load_scripts(path);
|
load_scripts(path);
|
||||||
|
@ -2109,5 +2109,9 @@ namespace scripting
|
|||||||
{"script_team", 31474},
|
{"script_team", 31474},
|
||||||
{"script_ai_invulnerable", 31024},
|
{"script_ai_invulnerable", 31024},
|
||||||
{"script_mp_style_helicopter", 31353},
|
{"script_mp_style_helicopter", 31353},
|
||||||
|
{"script_startingposition", 31455},
|
||||||
|
{"script_vehicle_selfremove", 31507},
|
||||||
|
{"script_stopnode", 31464},
|
||||||
|
{"script_unload", 31497},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user