mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-13 15:01:49 +00:00
add project args & add vc.get_project_args
This commit is contained in:
parent
4565c6a3bd
commit
aa5bd51206
5 changed files with 48 additions and 3 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
local _vc_headless = __VC_HEADLESS
|
local _vc_headless = __VC_HEADLESS
|
||||||
|
local _vc_project_args = __VC_PROJECT_ARGS
|
||||||
__VC_HEADLESS = nil
|
__VC_HEADLESS = nil
|
||||||
|
__VC_PROJECT_ARGS = nil
|
||||||
|
|
||||||
vc = {
|
vc = {
|
||||||
is_headless = function()
|
is_headless = function()
|
||||||
|
|
@ -300,6 +302,8 @@ require "core:internal/extensions/file"
|
||||||
require "core:internal/extensions/table"
|
require "core:internal/extensions/table"
|
||||||
require "core:internal/extensions/string"
|
require "core:internal/extensions/string"
|
||||||
|
|
||||||
|
vc.get_project_args = table.copy(_vc_project_args)
|
||||||
|
|
||||||
local bytearray = require "core:internal/bytearray"
|
local bytearray = require "core:internal/bytearray"
|
||||||
Bytearray = bytearray.FFIBytearray
|
Bytearray = bytearray.FFIBytearray
|
||||||
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
struct CoreParameters {
|
struct CoreParameters {
|
||||||
bool headless = false;
|
bool headless = false;
|
||||||
|
|
@ -13,4 +14,5 @@ struct CoreParameters {
|
||||||
std::filesystem::path projectFolder;
|
std::filesystem::path projectFolder;
|
||||||
std::string debugServerString;
|
std::string debugServerString;
|
||||||
int tps = 20;
|
int tps = 20;
|
||||||
|
std::unordered_map<std::string, std::string> projectArgs;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,12 @@
|
||||||
#include "usertypes/lua_type_pcmstream.hpp"
|
#include "usertypes/lua_type_pcmstream.hpp"
|
||||||
#include "engine/Engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
|
|
||||||
static debug::Logger logger("lua-state");
|
namespace {
|
||||||
static lua::State* main_thread = nullptr;
|
debug::Logger logger("lua-state");
|
||||||
static bool headless_mode = false;
|
lua::State* main_thread = nullptr;
|
||||||
|
bool headless_mode = false;
|
||||||
|
const std::unordered_map<std::string, std::string>* project_args;
|
||||||
|
}
|
||||||
|
|
||||||
using namespace lua;
|
using namespace lua;
|
||||||
|
|
||||||
|
|
@ -151,6 +154,13 @@ void lua::init_state(State* L, StateType stateType) {
|
||||||
pushboolean(L, headless_mode);
|
pushboolean(L, headless_mode);
|
||||||
setglobal(L, "__VC_HEADLESS");
|
setglobal(L, "__VC_HEADLESS");
|
||||||
|
|
||||||
|
createtable(L, 0, project_args->size());
|
||||||
|
for (const auto& [key, value] : *project_args) {
|
||||||
|
pushstring(L, value);
|
||||||
|
setfield(L, key);
|
||||||
|
}
|
||||||
|
setglobal(L, "__VC_PROJECT_ARGS");
|
||||||
|
|
||||||
auto file = "res:scripts/stdmin.lua";
|
auto file = "res:scripts/stdmin.lua";
|
||||||
auto src = io::read_string(file);
|
auto src = io::read_string(file);
|
||||||
lua::pop(L, lua::execute(L, 0, src, "core:scripts/stdmin.lua"));
|
lua::pop(L, lua::execute(L, 0, src, "core:scripts/stdmin.lua"));
|
||||||
|
|
@ -181,6 +191,7 @@ void lua::initialize(const EnginePaths& paths, const CoreParameters& params) {
|
||||||
logger.info() << LUAJIT_VERSION;
|
logger.info() << LUAJIT_VERSION;
|
||||||
|
|
||||||
headless_mode = params.headless;
|
headless_mode = params.headless;
|
||||||
|
project_args = ¶ms.projectArgs;
|
||||||
main_thread = create_state(
|
main_thread = create_state(
|
||||||
paths, params.headless ? StateType::SCRIPT : StateType::BASE
|
paths, params.headless ? StateType::SCRIPT : StateType::BASE
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,13 @@ namespace util {
|
||||||
return last[0] == '-';
|
return last[0] == '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isNextKeywordArg() const {
|
||||||
|
if (pos >= argc) {
|
||||||
|
throw std::runtime_error("unexpected end");
|
||||||
|
}
|
||||||
|
return argv[pos][0] == '-';
|
||||||
|
}
|
||||||
|
|
||||||
std::string next() {
|
std::string next() {
|
||||||
if (pos >= argc) {
|
if (pos >= argc) {
|
||||||
throw std::runtime_error("unexpected end");
|
throw std::runtime_error("unexpected end");
|
||||||
|
|
|
||||||
|
|
@ -97,11 +97,32 @@ static bool perform_keyword(
|
||||||
throw std::runtime_error("unknown argument " + keyword);
|
throw std::runtime_error("unknown argument " + keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_project_args(util::ArgsReader& reader, CoreParameters& params) {
|
||||||
|
while (reader.hasNext()) {
|
||||||
|
std::string key = reader.next();
|
||||||
|
if (!reader.isKeywordArg()) {
|
||||||
|
std::cerr << "--<keyword> argument expected" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
key = key.substr(2);
|
||||||
|
if (!reader.hasNext() || reader.isNextKeywordArg()) {
|
||||||
|
params.projectArgs[std::move(key)] = "";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
std::string value = reader.next();
|
||||||
|
params.projectArgs[std::move(key)] = std::move(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool parse_cmdline(int argc, char** argv, CoreParameters& params) {
|
bool parse_cmdline(int argc, char** argv, CoreParameters& params) {
|
||||||
util::ArgsReader reader(argc, argv);
|
util::ArgsReader reader(argc, argv);
|
||||||
reader.skip();
|
reader.skip();
|
||||||
while (reader.hasNext()) {
|
while (reader.hasNext()) {
|
||||||
std::string token = reader.next();
|
std::string token = reader.next();
|
||||||
|
if (token == "--") {
|
||||||
|
parse_project_args(reader, params);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (reader.isKeywordArg()) {
|
if (reader.isKeywordArg()) {
|
||||||
if (!perform_keyword(reader, token, params)) {
|
if (!perform_keyword(reader, token, params)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue