From bbe5688a532c57850368dfa82a076754250369c8 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 27 Mar 2025 08:50:42 +0300 Subject: [PATCH] fix entities.spawn in coroutines --- dev/tests/base_entities.lua | 8 +++++++- src/logic/scripting/lua/libs/libentity.cpp | 6 ++++-- src/logic/scripting/scripting.cpp | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dev/tests/base_entities.lua b/dev/tests/base_entities.lua index 7b0e2e77..91463a4b 100644 --- a/dev/tests/base_entities.lua +++ b/dev/tests/base_entities.lua @@ -1,10 +1,12 @@ -local util = require("core:tests_util") +local util = require "core:tests_util" -- Create world and prepare settings util.create_demo_world("core:default") app.set_setting("chunks.load-distance", 3) app.set_setting("chunks.load-speed", 1) +local base_util = require "base:util" + -- Create player local pid = player.create("Xerxes") player.set_spawnpoint(pid, 0, 100, 0) @@ -22,3 +24,7 @@ assert(block.get(0, 2, 0) == 0) -- Wait for the block to fall app.sleep_until(function () return block.get(0, 1, 0) == block.index("base:sand") end, 100) + +local drop = base_util.drop({player.get_pos(pid)}, item.index("base:bazalt_breaker"), 11) +assert(drop ~= nil) +assert(drop.rigidbody ~= nil) diff --git a/src/logic/scripting/lua/libs/libentity.cpp b/src/logic/scripting/lua/libs/libentity.cpp index 28a7bd84..8e00aa1c 100644 --- a/src/logic/scripting/lua/libs/libentity.cpp +++ b/src/logic/scripting/lua/libs/libentity.cpp @@ -63,8 +63,10 @@ static int l_spawn(lua::State* L) { if (lua::gettop(L) > 2) { args = lua::tovalue(L, 3); } - level->entities->spawn(def, pos, std::move(args)); - return 1; + entityid_t id = level->entities->spawn(def, pos, std::move(args)); + lua::get_from(L, "entities", "get", true); + lua::pushinteger(L, id); + return lua::call_nothrow(L, 1); } static int l_despawn(lua::State* L) { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 9ebd649d..33ff0587 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -549,6 +549,7 @@ void scripting::on_entity_spawn( const dv::value& saved ) { auto L = lua::get_main_state(); + lua::stackguard guard(L); lua::requireglobal(L, STDCOMP); if (lua::getfield(L, "new_Entity")) { lua::pushinteger(L, eid);