From 1b99a48849b616e52c7db9f39c7c8b8d4dc66d15 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Jul 2024 10:17:20 +0300 Subject: [PATCH] update entities.spawn(...) semantics to the docs state --- res/content/base/scripts/components/drop.lua | 2 +- .../base/scripts/components/falling_block.lua | 2 +- res/content/base/scripts/hud.lua | 2 +- res/content/base/scripts/sand.lua | 3 ++- src/logic/scripting/lua/libentity.cpp | 7 +++++-- src/logic/scripting/scripting.cpp | 12 +++++++++--- src/logic/scripting/scripting.hpp | 2 +- src/objects/Entities.cpp | 4 ++-- src/objects/Entities.hpp | 2 +- 9 files changed, 23 insertions(+), 13 deletions(-) diff --git a/res/content/base/scripts/components/drop.lua b/res/content/base/scripts/components/drop.lua index eb2781a5..5a6fa228 100644 --- a/res/content/base/scripts/components/drop.lua +++ b/res/content/base/scripts/components/drop.lua @@ -7,7 +7,7 @@ ready = false target = -1 ARGS = ARGS or {} -local dropitem = ARGS.item or {} +local dropitem = ARGS if SAVED_DATA.item then dropitem.id = item.index(SAVED_DATA.item) dropitem.count = SAVED_DATA.count diff --git a/res/content/base/scripts/components/falling_block.lua b/res/content/base/scripts/components/falling_block.lua index a4cec674..c5a91a79 100644 --- a/res/content/base/scripts/components/falling_block.lua +++ b/res/content/base/scripts/components/falling_block.lua @@ -26,7 +26,7 @@ function on_grounded() block.set(ix, iy, iz, block.index(blockid)) else local picking_item = block.get_picking_item(block.index(blockid)) - local drop = entities.spawn("base:drop", pos, {item={id=picking_item, count=1}}) + local drop = entities.spawn("base:drop", pos, {base__drop={id=picking_item, count=1}}) drop.rigidbody:set_vel(vec3.spherical_rand(5.0)) end entity:despawn() diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index c72d808f..694ff847 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -17,7 +17,7 @@ function on_hud_open() local pvel = {player.get_vel(pid)} local ppos = vec3.add({player.get_pos(pid)}, {0, 0.7, 0}) local throw_force = vec3.mul(player.get_dir(pid), DROP_FORCE) - local drop = entities.spawn("base:drop", ppos, {item={ + local drop = entities.spawn("base:drop", ppos, {base__drop={ id=itemid, count=1 }}) diff --git a/res/content/base/scripts/sand.lua b/res/content/base/scripts/sand.lua index e699c61a..a3f148dc 100644 --- a/res/content/base/scripts/sand.lua +++ b/res/content/base/scripts/sand.lua @@ -1,6 +1,7 @@ local function update(x, y, z) if block.is_replaceable_at(x, y-1, z) then - entities.spawn("base:falling_block", {x+0.5, y+0.5, z+0.5}, {block='base:sand'}) + entities.spawn("base:falling_block", {x+0.5, y+0.5, z+0.5}, + {base__falling_block={block='base:sand'}}) block.set(x, y, z, 0) end end diff --git a/src/logic/scripting/lua/libentity.cpp b/src/logic/scripting/lua/libentity.cpp index e6621658..38dcbf0b 100644 --- a/src/logic/scripting/lua/libentity.cpp +++ b/src/logic/scripting/lua/libentity.cpp @@ -20,9 +20,12 @@ static int l_spawn(lua::State* L) { auto defname = lua::tostring(L, 1); auto& def = content->entities.require(defname); auto pos = lua::tovec3(L, 2); - dynamic::Value args = dynamic::NONE; + dynamic::Map_sptr args = nullptr; if (lua::gettop(L) > 2) { - args = lua::tovalue(L, 3); + auto value = lua::tovalue(L, 3); + if (auto map = std::get_if(&value)) { + args = *map; + } } level->entities->spawn(def, pos, args); return 1; diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index dd07620c..06205b1e 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -301,7 +301,7 @@ void scripting::on_entity_spawn( const EntityDef&, entityid_t eid, const std::vector>& components, - dynamic::Value args, + dynamic::Map_sptr args, dynamic::Map_sptr saved ) { auto L = lua::get_main_thread(); @@ -321,8 +321,14 @@ void scripting::on_entity_spawn( lua::get_from(L, lua::CHUNKS_TABLE, component->name, true); lua::pushenv(L, *compenv); - lua::pushvalue(L, args); - lua::setfield(L, "ARGS"); + if (args != nullptr) { + std::string compfieldname = component->name; + util::replaceAll(compfieldname, ":", "__"); + if (auto datamap = args->map(compfieldname)) { + lua::pushvalue(L, datamap); + lua::setfield(L, "ARGS"); + } + } if (saved == nullptr) { lua::createtable(L, 0, 0); diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 6064f132..a2778c76 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -82,7 +82,7 @@ namespace scripting { const EntityDef& def, entityid_t eid, const std::vector>& components, - dynamic::Value args, + dynamic::Map_sptr args, dynamic::Map_sptr saved ); void on_entity_despawn(const Entity& entity); diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 62a0ae1d..d47350bf 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -95,7 +95,7 @@ static void initialize_body( entityid_t Entities::spawn( EntityDef& def, glm::vec3 position, - dynamic::Value args, + dynamic::Map_sptr args, dynamic::Map_sptr saved, entityid_t uid) { @@ -179,7 +179,7 @@ void Entities::loadEntity(const dynamic::Map_sptr& map) { throw std::runtime_error("could not read entity - invalid UID"); } auto& def = level->content->entities.require(defname); - spawn(def, {}, dynamic::NONE, map, uid); + spawn(def, {}, nullptr, map, uid); } void Entities::loadEntity(const dynamic::Map_sptr& map, Entity entity) { diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index b8e03a17..bbb847a3 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -182,7 +182,7 @@ public: entityid_t spawn( EntityDef& def, glm::vec3 position, - dynamic::Value args=dynamic::NONE, + dynamic::Map_sptr args=nullptr, dynamic::Map_sptr saved=nullptr, entityid_t uid=0);