From 1b41a75cf45c330177d9fade2e5265d82febba84 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 1 Jul 2024 00:17:58 +0300 Subject: [PATCH] add component ARGS variable --- res/content/base/entities/drop.json | 2 +- src/logic/scripting/lua/libentity.cpp | 6 +++++- src/logic/scripting/scripting.cpp | 9 ++++++++- src/logic/scripting/scripting.hpp | 7 ++++++- src/objects/Entities.cpp | 4 ++-- src/objects/Entities.hpp | 3 ++- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/res/content/base/entities/drop.json b/res/content/base/entities/drop.json index 174f05b2..cf9add8e 100644 --- a/res/content/base/entities/drop.json +++ b/res/content/base/entities/drop.json @@ -1,5 +1,5 @@ { - "hitbox": [0.2, 0.2, 0.2], + "hitbox": [0.2, 0.125, 0.2], "triggers": [ [-0.2, -0.2, -0.2, 0.2, 0.2, 0.2] ] diff --git a/src/logic/scripting/lua/libentity.cpp b/src/logic/scripting/lua/libentity.cpp index 11b16e2c..622c12b6 100644 --- a/src/logic/scripting/lua/libentity.cpp +++ b/src/logic/scripting/lua/libentity.cpp @@ -31,7 +31,11 @@ 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); - level->entities->spawn(def, pos); + dynamic::Value args = dynamic::NONE; + if (lua::gettop(L) > 2) { + args = lua::tovalue(L, 3); + } + level->entities->spawn(def, pos, args); return 1; } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 8d9e6a4c..5843f6d2 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -256,7 +256,12 @@ bool scripting::on_item_break_block(Player* player, const ItemDef* item, int x, }); } -scriptenv scripting::on_entity_spawn(const EntityDef& def, entityid_t eid, entity_funcs_set& funcsset) { +scriptenv scripting::on_entity_spawn( + const EntityDef& def, + entityid_t eid, + entity_funcs_set& funcsset, + dynamic::Value args +) { auto L = lua::get_main_thread(); lua::requireglobal(L, STDCOMP); if (lua::getfield(L, "new_Entity")) { @@ -266,6 +271,8 @@ scriptenv scripting::on_entity_spawn(const EntityDef& def, entityid_t eid, entit auto entityenv = create_entity_environment(get_root_environment(), -1); lua::get_from(L, lua::CHUNKS_TABLE, def.scriptName, true); lua::pushenv(L, *entityenv); + lua::pushvalue(L, args); + lua::setfield(L, "ARGS"); lua::setfenv(L); lua::call_nothrow(L, 0, 0); diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index f6d1ccdb..72900a37 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -76,7 +76,12 @@ namespace scripting { /// @return true if prevents default action bool on_item_break_block(Player* player, const ItemDef* item, int x, int y, int z); - scriptenv on_entity_spawn(const EntityDef& def, entityid_t eid, entity_funcs_set&); + scriptenv on_entity_spawn( + const EntityDef& def, + entityid_t eid, + entity_funcs_set&, + dynamic::Value args + ); bool on_entity_despawn(const EntityDef& def, const Entity& entity); bool on_entity_grounded(const Entity& entity, float force); bool on_entity_fall(const Entity& entity); diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index b1faee13..512f7213 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -30,7 +30,7 @@ void Entity::destroy() { Entities::Entities(Level* level) : level(level) { } -entityid_t Entities::spawn(EntityDef& def, glm::vec3 pos) { +entityid_t Entities::spawn(EntityDef& def, glm::vec3 pos, dynamic::Value args) { auto entity = registry.create(); glm::vec3 size(1); auto id = nextID++; @@ -55,7 +55,7 @@ entityid_t Entities::spawn(EntityDef& def, glm::vec3 pos) { } auto& scripting = registry.emplace(entity, entity_funcs_set {}, nullptr); entities[id] = entity; - scripting.env = scripting::on_entity_spawn(def, id, scripting.funcsset); + scripting.env = scripting::on_entity_spawn(def, id, scripting.funcsset, std::move(args)); return id; } diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index 289849fe..91fe106c 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -3,6 +3,7 @@ #include "../typedefs.hpp" #include "../physics/Hitbox.hpp" +#include "../data/dynamic.hpp" #include #include @@ -131,7 +132,7 @@ public: void renderDebug(LineBatch& batch, const Frustum& frustum); void render(Assets* assets, ModelBatch& batch, const Frustum& frustum); - entityid_t spawn(EntityDef& def, glm::vec3 pos); + entityid_t spawn(EntityDef& def, glm::vec3 pos, dynamic::Value args=dynamic::NONE); std::optional get(entityid_t id) { const auto& found = entities.find(id);