From 8b5261f4f14ee31894dcf5125a4836ff140de8a9 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 18 Jan 2026 23:35:18 +0300 Subject: [PATCH] fix fatal error when skeleton is missing --- src/logic/scripting/lua/libs/lib__skeleton.cpp | 6 ++++++ src/objects/Entities.cpp | 13 +++++++++---- src/objects/Entity.cpp | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/logic/scripting/lua/libs/lib__skeleton.cpp b/src/logic/scripting/lua/libs/lib__skeleton.cpp index be42c356e..2fb5d4fa0 100644 --- a/src/logic/scripting/lua/libs/lib__skeleton.cpp +++ b/src/logic/scripting/lua/libs/lib__skeleton.cpp @@ -36,6 +36,9 @@ static rigging::Skeleton* get_skeleton(lua::State* L) { static int l_get_model(lua::State* L) { if (auto skeleton = get_skeleton(L)) { + if (skeleton->config == nullptr) { + return 0; + } auto& rigConfig = *skeleton->config; auto index = index_range_check(*skeleton, lua::tointeger(L, 2)); const auto& modelOverride = skeleton->modelOverrides[index]; @@ -96,6 +99,9 @@ static int l_set_texture(lua::State* L) { static int l_index(lua::State* L) { if (auto skeleton = get_skeleton(L)) { + if (skeleton->config == nullptr) { + return 0; + } if (auto bone = skeleton->config->find(lua::require_string(L, 2))) { return lua::pushinteger(L, bone->getIndex()); } diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 179a39fd6..e1040776d 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -147,7 +147,7 @@ void Entities::loadEntity(const dv::value& map, Entity entity) { if (map.has(COMP_TRANSFORM)) { transform.deserialize(map[COMP_TRANSFORM]); } - if (skeleton == nullptr) { + if (skeleton == nullptr || skeleton->config == nullptr) { return; } std::string skeletonName = skeleton->config->getName(); @@ -397,6 +397,9 @@ void Entities::renderDebug( ctx.setLineWidth(2); for (auto [entity, transform, skeleton] : view.each()) { auto config = skeleton.config; + if (config == nullptr) { + continue; + } const auto& pos = transform.pos; const auto& size = transform.size; if (frustum && !frustum->isBoxVisible(pos - size, pos + size)) { @@ -434,9 +437,11 @@ void Entities::render( } const auto* rigConfig = skeleton.config; - rigConfig->render( - assets, batch, skeleton, transform.rot, pos, size - ); + if (rigConfig) { + rigConfig->render( + assets, batch, skeleton, transform.rot, pos, size + ); + } } } diff --git a/src/objects/Entity.cpp b/src/objects/Entity.cpp index 5fbfe1d99..e8c276dd2 100644 --- a/src/objects/Entity.cpp +++ b/src/objects/Entity.cpp @@ -64,7 +64,7 @@ dv::value Entity::serialize() const { root[COMP_RIGIDBODY] = rigidbody.serialize(def.save.body.velocity, def.save.body.settings); - if (skeleton != nullptr) { + if (skeleton != nullptr && skeleton->config != nullptr) { if (skeleton->config->getName() != def.skeletonName) { root["skeleton-name"] = skeleton->config->getName(); }