add test.quit, test.reopen_world
This commit is contained in:
parent
fa1646a9bd
commit
5e55e20ec4
@ -1,6 +1,8 @@
|
|||||||
test.set_setting("chunks.load-distance", 3)
|
test.set_setting("chunks.load-distance", 3)
|
||||||
test.set_setting("chunks.load-speed", 1)
|
test.set_setting("chunks.load-speed", 1)
|
||||||
|
|
||||||
|
test.quit()
|
||||||
|
|
||||||
test.reconfig_packs({"base"}, {})
|
test.reconfig_packs({"base"}, {})
|
||||||
test.new_world("demo", "2019", "core:default")
|
test.new_world("demo", "2019", "core:default")
|
||||||
local pid1 = player.create("Xerxes")
|
local pid1 = player.create("Xerxes")
|
||||||
|
|||||||
@ -9,16 +9,41 @@ function sleep(timesec)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function tb_frame_tostring(frame)
|
||||||
|
local s = frame.short_src
|
||||||
|
if frame.what ~= "C" then
|
||||||
|
s = s .. ":" .. tostring(frame.currentline)
|
||||||
|
end
|
||||||
|
if frame.what == "main" then
|
||||||
|
s = s .. ": in main chunk"
|
||||||
|
elseif frame.name then
|
||||||
|
s = s .. ": in function " .. utf8.escape(frame.name)
|
||||||
|
end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
if test then
|
if test then
|
||||||
test.sleep = sleep
|
test.sleep = sleep
|
||||||
test.name = __VC_TEST_NAME
|
test.name = __VC_TEST_NAME
|
||||||
test.new_world = core.new_world
|
test.new_world = core.new_world
|
||||||
test.open_world = core.open_world
|
test.open_world = core.open_world
|
||||||
test.close_world = core.close_world
|
test.close_world = core.close_world
|
||||||
|
test.reopen_world = core.reopen_world
|
||||||
test.reconfig_packs = core.reconfig_packs
|
test.reconfig_packs = core.reconfig_packs
|
||||||
test.set_setting = core.set_setting
|
test.set_setting = core.set_setting
|
||||||
test.tick = coroutine.yield
|
test.tick = coroutine.yield
|
||||||
|
|
||||||
|
function test.quit()
|
||||||
|
local tb = debug.get_traceback(1)
|
||||||
|
local s = "test.quit() traceback:"
|
||||||
|
for i, frame in ipairs(tb) do
|
||||||
|
s = s .. "\n\t"..tb_frame_tostring(frame)
|
||||||
|
end
|
||||||
|
debug.log(s)
|
||||||
|
core.quit()
|
||||||
|
coroutine.yield()
|
||||||
|
end
|
||||||
|
|
||||||
function test.sleep_until(predicate, max_ticks)
|
function test.sleep_until(predicate, max_ticks)
|
||||||
max_ticks = max_ticks or 1e9
|
max_ticks = max_ticks or 1e9
|
||||||
local ticks = 0
|
local ticks = 0
|
||||||
@ -382,7 +407,9 @@ end
|
|||||||
function __vc_stop_coroutine(id)
|
function __vc_stop_coroutine(id)
|
||||||
local co = __vc_coroutines[id]
|
local co = __vc_coroutines[id]
|
||||||
if co then
|
if co then
|
||||||
coroutine.close(co)
|
if coroutine.close then
|
||||||
|
coroutine.close(co)
|
||||||
|
end
|
||||||
__vc_coroutines[id] = nil
|
__vc_coroutines[id] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -41,6 +41,11 @@ void ServerMainloop::run() {
|
|||||||
double delta = targetDelta;
|
double delta = targetDelta;
|
||||||
auto begin = steady_clock::now();
|
auto begin = steady_clock::now();
|
||||||
while (process->isActive()) {
|
while (process->isActive()) {
|
||||||
|
if (engine.isQuitSignal()) {
|
||||||
|
process->terminate();
|
||||||
|
logger.info() << "script has been terminated due to quit signal";
|
||||||
|
break;
|
||||||
|
}
|
||||||
time.step(delta);
|
time.step(delta);
|
||||||
process->update();
|
process->update();
|
||||||
if (controller) {
|
if (controller) {
|
||||||
|
|||||||
@ -461,6 +461,17 @@ void Engine::onWorldClosed() {
|
|||||||
levelConsumer(nullptr);
|
levelConsumer(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Engine::quit() {
|
||||||
|
quitSignal = true;
|
||||||
|
if (!isHeadless()) {
|
||||||
|
Window::setShouldClose(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Engine::isQuitSignal() const {
|
||||||
|
return quitSignal;
|
||||||
|
}
|
||||||
|
|
||||||
gui::GUI* Engine::getGUI() {
|
gui::GUI* Engine::getGUI() {
|
||||||
return gui.get();
|
return gui.get();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,6 +74,7 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
std::unique_ptr<gui::GUI> gui;
|
std::unique_ptr<gui::GUI> gui;
|
||||||
Time time;
|
Time time;
|
||||||
consumer<std::unique_ptr<Level>> levelConsumer;
|
consumer<std::unique_ptr<Level>> levelConsumer;
|
||||||
|
bool quitSignal = false;
|
||||||
|
|
||||||
void loadControls();
|
void loadControls();
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
@ -138,6 +139,10 @@ public:
|
|||||||
void onWorldOpen(std::unique_ptr<Level> level);
|
void onWorldOpen(std::unique_ptr<Level> level);
|
||||||
void onWorldClosed();
|
void onWorldClosed();
|
||||||
|
|
||||||
|
void quit();
|
||||||
|
|
||||||
|
bool isQuitSignal() const;
|
||||||
|
|
||||||
/// @brief Get current Content instance
|
/// @brief Get current Content instance
|
||||||
const Content* getContent() const;
|
const Content* getContent() const;
|
||||||
|
|
||||||
|
|||||||
@ -56,6 +56,9 @@ static int l_open_world(lua::State* L) {
|
|||||||
/// @brief Reopen world
|
/// @brief Reopen world
|
||||||
static int l_reopen_world(lua::State*) {
|
static int l_reopen_world(lua::State*) {
|
||||||
auto controller = engine->getController();
|
auto controller = engine->getController();
|
||||||
|
if (level == nullptr) {
|
||||||
|
throw std::runtime_error("no world open");
|
||||||
|
}
|
||||||
controller->reopenWorld(level->getWorld());
|
controller->reopenWorld(level->getWorld());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -229,7 +232,7 @@ static int l_open_folder(lua::State* L) {
|
|||||||
|
|
||||||
/// @brief Quit the game
|
/// @brief Quit the game
|
||||||
static int l_quit(lua::State*) {
|
static int l_quit(lua::State*) {
|
||||||
Window::setShouldClose(true);
|
engine->quit();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user