From 9e28b783fd015a58e49d60393eda4e020b54cc07 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 13 Apr 2025 20:52:03 +0300 Subject: [PATCH] make BlockMaterial serializable --- src/content/ContentLoader.cpp | 6 +----- src/logic/scripting/scripting.cpp | 2 +- src/voxels/Block.cpp | 20 +++++++++++++++++++- src/voxels/Block.hpp | 7 +++++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 65608b2d..2aaff315 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -186,11 +186,7 @@ void ContentUnitLoader::loadUnit( void ContentLoader::loadBlockMaterial( BlockMaterial& def, const io::path& file ) { - auto root = io::read_json(file); - root.at("steps-sound").get(def.stepsSound); - root.at("place-sound").get(def.placeSound); - root.at("break-sound").get(def.breakSound); - root.at("hit-sound").get(def.hitSound); + def.deserialize(io::read_json(file)); if (def.hitSound.empty()) { def.hitSound = def.stepsSound; } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 4cd71810..5d7292d4 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -243,7 +243,7 @@ void scripting::on_content_load(Content* content) { const auto& materials = content->getBlockMaterials(); lua::createtable(L, 0, materials.size()); for (const auto& [name, material] : materials) { - lua::pushvalue(L, material->serialize()); + lua::pushvalue(L, material->toTable()); lua::setfield(L, name); } lua::setfield(L, "materials"); diff --git a/src/voxels/Block.cpp b/src/voxels/Block.cpp index 7ef9d317..e7153665 100644 --- a/src/voxels/Block.cpp +++ b/src/voxels/Block.cpp @@ -8,7 +8,7 @@ #include "presets/ParticlesPreset.hpp" #include "util/stringutil.hpp" -dv::value BlockMaterial::serialize() const { +dv::value BlockMaterial::toTable() const { return dv::object({ {"name", name}, {"stepsSound", stepsSound}, @@ -18,6 +18,24 @@ dv::value BlockMaterial::serialize() const { }); } +dv::value BlockMaterial::serialize() const { + return dv::object({ + {"name", name}, + {"steps-sound", stepsSound}, + {"place-sound", placeSound}, + {"break-sound", breakSound}, + {"hit-sound", hitSound} + }); +} + +void BlockMaterial::deserialize(const dv::value& src) { + src.at("name").get(name); + src.at("steps-sound").get(stepsSound); + src.at("place-sound").get(placeSound); + src.at("break-sound").get(breakSound); + src.at("hit-sound").get(hitSound); +} + CoordSystem::CoordSystem(glm::ivec3 axisX, glm::ivec3 axisY, glm::ivec3 axisZ) : axes({axisX, axisY, axisZ}) { fix = glm::ivec3(0); diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index 6776ffa5..9e3a28df 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -10,6 +10,7 @@ #include "maths/aabb.hpp" #include "typedefs.hpp" #include "util/EnumMetadata.hpp" +#include "interfaces/Serializable.hpp" struct ParticlesPreset; @@ -116,14 +117,16 @@ VC_ENUM_END using BoxModel = AABB; /// @brief Common kit of block properties applied to groups of blocks -struct BlockMaterial { +struct BlockMaterial : Serializable { std::string name; std::string stepsSound; std::string placeSound; std::string breakSound; std::string hitSound; - dv::value serialize() const; + dv::value toTable() const; // for compatibility + dv::value serialize() const override; + void deserialize(const dv::value& src) override; }; /// @brief Block properties definition