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);