feat: passing args to component in entity definition

This commit is contained in:
MihailRis 2025-08-06 23:34:00 +03:00
parent f2aa77db8b
commit f6be6689aa
5 changed files with 33 additions and 7 deletions

View File

@ -30,7 +30,18 @@ template<> void ContentUnitLoader<EntityDef>::loadUnit(
if (auto found = root.at("components")) {
for (const auto& elem : *found) {
def.components.emplace_back(elem.asString());
std::string name;
dv::value params;
if (elem.isObject()) {
name = elem["name"].asString();
if (elem.has("args")) {
params = elem["args"];
}
} else {
name = elem.asString();
}
def.components.push_back(ComponentInstance {
std::move(name), std::move(params)});
}
}
if (auto found = root.at("hitbox")) {

View File

@ -603,6 +603,8 @@ void scripting::on_entity_spawn(
} else {
lua::createtable(L, 0, 0);
}
} else if (component->params != nullptr) {
lua::pushvalue(L, component->params);
} else {
lua::createtable(L, 0, 0);
}

View File

@ -173,9 +173,9 @@ entityid_t Entities::spawn(
auto& scripting = registry.emplace<ScriptComponents>(entity);
registry.emplace<rigging::Skeleton>(entity, skeleton->instance());
for (auto& componentName : def.components) {
for (auto& instance : def.components) {
auto component = std::make_unique<UserComponent>(
componentName, EntityFuncsSet {}, nullptr
instance.component, EntityFuncsSet {}, nullptr, instance.params
);
scripting.components.emplace_back(std::move(component));
}

View File

@ -80,11 +80,18 @@ struct UserComponent {
std::string name;
EntityFuncsSet funcsset;
scriptenv env;
dv::value params;
UserComponent(
const std::string& name, EntityFuncsSet funcsset, scriptenv env
const std::string& name,
EntityFuncsSet funcsset,
scriptenv env,
dv::value params
)
: name(name), funcsset(funcsset), env(env) {
: name(name),
funcsset(funcsset),
env(std::move(env)),
params(std::move(params)) {
}
};

View File

@ -5,6 +5,7 @@
#include <glm/glm.hpp>
#include "typedefs.hpp"
#include "data/dv.hpp"
#include "maths/aabb.hpp"
#include "physics/Hitbox.hpp"
@ -12,12 +13,17 @@ namespace rigging {
class SkeletonConfig;
}
struct ComponentInstance {
std::string component;
dv::value params;
};
struct EntityDef {
/// @brief Entity string id (with prefix included)
std::string const name;
/// @brief Component IDs
std::vector<std::string> components;
/// @brief Component instances
std::vector<ComponentInstance> components;
/// @brief Physic body type
BodyType bodyType = BodyType::DYNAMIC;