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-speed", 1)
|
||||
|
||||
test.quit()
|
||||
|
||||
test.reconfig_packs({"base"}, {})
|
||||
test.new_world("demo", "2019", "core:default")
|
||||
local pid1 = player.create("Xerxes")
|
||||
|
||||
@ -9,16 +9,41 @@ function sleep(timesec)
|
||||
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
|
||||
test.sleep = sleep
|
||||
test.name = __VC_TEST_NAME
|
||||
test.new_world = core.new_world
|
||||
test.open_world = core.open_world
|
||||
test.close_world = core.close_world
|
||||
test.reopen_world = core.reopen_world
|
||||
test.reconfig_packs = core.reconfig_packs
|
||||
test.set_setting = core.set_setting
|
||||
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)
|
||||
max_ticks = max_ticks or 1e9
|
||||
local ticks = 0
|
||||
@ -382,7 +407,9 @@ end
|
||||
function __vc_stop_coroutine(id)
|
||||
local co = __vc_coroutines[id]
|
||||
if co then
|
||||
coroutine.close(co)
|
||||
if coroutine.close then
|
||||
coroutine.close(co)
|
||||
end
|
||||
__vc_coroutines[id] = nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -41,6 +41,11 @@ void ServerMainloop::run() {
|
||||
double delta = targetDelta;
|
||||
auto begin = steady_clock::now();
|
||||
while (process->isActive()) {
|
||||
if (engine.isQuitSignal()) {
|
||||
process->terminate();
|
||||
logger.info() << "script has been terminated due to quit signal";
|
||||
break;
|
||||
}
|
||||
time.step(delta);
|
||||
process->update();
|
||||
if (controller) {
|
||||
|
||||
@ -461,6 +461,17 @@ void Engine::onWorldClosed() {
|
||||
levelConsumer(nullptr);
|
||||
}
|
||||
|
||||
void Engine::quit() {
|
||||
quitSignal = true;
|
||||
if (!isHeadless()) {
|
||||
Window::setShouldClose(true);
|
||||
}
|
||||
}
|
||||
|
||||
bool Engine::isQuitSignal() const {
|
||||
return quitSignal;
|
||||
}
|
||||
|
||||
gui::GUI* Engine::getGUI() {
|
||||
return gui.get();
|
||||
}
|
||||
|
||||
@ -74,6 +74,7 @@ class Engine : public util::ObjectsKeeper {
|
||||
std::unique_ptr<gui::GUI> gui;
|
||||
Time time;
|
||||
consumer<std::unique_ptr<Level>> levelConsumer;
|
||||
bool quitSignal = false;
|
||||
|
||||
void loadControls();
|
||||
void loadSettings();
|
||||
@ -138,6 +139,10 @@ public:
|
||||
void onWorldOpen(std::unique_ptr<Level> level);
|
||||
void onWorldClosed();
|
||||
|
||||
void quit();
|
||||
|
||||
bool isQuitSignal() const;
|
||||
|
||||
/// @brief Get current Content instance
|
||||
const Content* getContent() const;
|
||||
|
||||
|
||||
@ -56,6 +56,9 @@ static int l_open_world(lua::State* L) {
|
||||
/// @brief Reopen world
|
||||
static int l_reopen_world(lua::State*) {
|
||||
auto controller = engine->getController();
|
||||
if (level == nullptr) {
|
||||
throw std::runtime_error("no world open");
|
||||
}
|
||||
controller->reopenWorld(level->getWorld());
|
||||
return 0;
|
||||
}
|
||||
@ -229,7 +232,7 @@ static int l_open_folder(lua::State* L) {
|
||||
|
||||
/// @brief Quit the game
|
||||
static int l_quit(lua::State*) {
|
||||
Window::setShouldClose(true);
|
||||
engine->quit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user