add entity on_save event and SAVED_DATA variable

This commit is contained in:
MihailRis 2024-07-05 18:35:46 +03:00
parent e301dbe164
commit 08cc78289d
6 changed files with 36 additions and 4 deletions

View File

@ -12,6 +12,11 @@ local rotation = mat4.rotate({
math.random(), math.random(), math.random()
}, 360)
function on_save()
SAVED_DATA.test = 5
print("SAVE ENTITY")
end
do -- setup visuals
local matrix = mat4.idt()
local icon = item.icon(dropitem.id)

View File

@ -263,6 +263,15 @@ bool scripting::on_item_break_block(Player* player, const ItemDef* item, int x,
});
}
dynamic::Value scripting::get_component_value(const scriptenv& env, const std::string& name) {
auto L = lua::get_main_thread();
lua::pushenv(L, *env);
if (lua::getfield(L, name)) {
return lua::tovalue(L, -1);
}
return dynamic::NONE;
}
void scripting::on_entity_spawn(
const EntityDef& def,
entityid_t eid,
@ -279,12 +288,17 @@ void scripting::on_entity_spawn(
lua::pushvalue(L, -1);
}
for (auto& component : components) {
auto compenv = create_component_environment(
get_root_environment(), -1, component->name);
auto compenv = create_component_environment(get_root_environment(), -1,
component->name);
lua::get_from(L, lua::CHUNKS_TABLE, component->name, true);
lua::pushenv(L, *compenv);
lua::pushvalue(L, args);
lua::setfield(L, "ARGS");
lua::createtable(L, 0, 0);
lua::setfield(L, "SAVED_DATA");
lua::setfenv(L);
lua::call_nothrow(L, 0, 0);
@ -379,7 +393,6 @@ void scripting::on_trigger_enter(const Entity& entity, size_t index, entityid_t
}
}
void scripting::on_trigger_exit(const Entity& entity, size_t index, entityid_t oid) {
const auto& script = entity.getScripting();
for (auto& component : script.components) {

View File

@ -76,6 +76,7 @@ namespace scripting {
/// @return true if prevents default action
bool on_item_break_block(Player* player, const ItemDef* item, int x, int y, int z);
dynamic::Value get_component_value(const scriptenv& env, const std::string& name);
void on_entity_spawn(
const EntityDef& def,
entityid_t eid,

View File

@ -112,6 +112,10 @@ void Entities::despawn(entityid_t id) {
}
}
void Entities::onSave(const Entity& entity) {
scripting::on_entity_save(entity);
}
dynamic::Value Entities::serialize(const Entity& entity) {
auto root = dynamic::create_map();
auto& eid = entity.getID();
@ -140,7 +144,6 @@ dynamic::Value Entities::serialize(const Entity& entity) {
if (rig.config->getName() != def.rigName) {
root->put("rig", rig.config->getName());
}
if (def.save.rig.pose || def.save.rig.textures) {
auto& rigmap = root->putMap("rig");
if (def.save.rig.textures) {
@ -156,6 +159,14 @@ dynamic::Value Entities::serialize(const Entity& entity) {
}
}
}
auto& scripts = entity.getScripting();
if (!scripts.components.empty()) {
auto& compsMap = root->putMap("comps");
for (auto& comp : scripts.components) {
auto data = scripting::get_component_value(comp->env, "SAVED_DATA");
compsMap.put(comp->name, data);
}
}
return root;
}

View File

@ -183,6 +183,7 @@ public:
return std::nullopt;
}
void onSave(const Entity& entity);
std::vector<Entity> getAllInside(AABB aabb);
void despawn(entityid_t id);
dynamic::Value serialize(const Entity& entity);

View File

@ -713,6 +713,7 @@ void Chunks::save(Chunk* chunk) {
auto root = dynamic::create_map();
auto& list = root->putList("data");
for (auto& entity : entities) {
level->entities->onSave(entity);
list.put(level->entities->serialize(entity));
}
if (!entities.empty()) {