feat: passing args to component in entity definition
This commit is contained in:
parent
f2aa77db8b
commit
f6be6689aa
@ -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")) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user