diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 9d29b873..47094bc7 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -419,8 +419,9 @@ end function start_coroutine(chunk, name) local co = coroutine.create(function() - local status, error = xpcall(chunk, function(...) - gui.alert(debug.traceback(), function() + local status, error = xpcall(chunk, function(err) + local fullmsg = "error: "..string.match(err, ": (.+)").."\n"..debug.traceback() + gui.alert(fullmsg, function() if world.is_open() then __vc_app.close_world() else @@ -429,7 +430,7 @@ function start_coroutine(chunk, name) menu.page = "main" end end) - return ... + return fullmsg end) if not status then debug.error(error) diff --git a/src/content/PacksManager.cpp b/src/content/PacksManager.cpp index 49c3014c..4eeaa5eb 100644 --- a/src/content/PacksManager.cpp +++ b/src/content/PacksManager.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "util/listutil.hpp" @@ -124,7 +125,9 @@ std::vector PacksManager::assemble( std::queue queue; std::queue queue2; - for (auto& name : names) { + std::sort(allNames.begin(), allNames.end()); + + for (auto& name : allNames) { auto found = packs.find(name); if (found == packs.end()) { throw contentpack_error(name, io::path(), "pack not found"); diff --git a/src/logic/scripting/lua/libs/libworld.cpp b/src/logic/scripting/lua/libs/libworld.cpp index 9f640039..d18f964a 100644 --- a/src/logic/scripting/lua/libs/libworld.cpp +++ b/src/logic/scripting/lua/libs/libworld.cpp @@ -5,6 +5,7 @@ #include "api_lua.hpp" #include "assets/AssetsLoader.hpp" #include "coders/json.hpp" +#include "content/Content.hpp" #include "engine/Engine.hpp" #include "world/files/WorldFiles.hpp" #include "io/engine_paths.hpp" @@ -181,7 +182,7 @@ static int l_set_chunk_data(lua::State* L) { return lua::pushboolean(L, false); } compressed_chunks::decode( - *chunk, buffer.data(), buffer.size() + *chunk, buffer.data(), buffer.size(), *content->getIndices() ); if (controller->getChunksController()->lighting == nullptr) { return lua::pushboolean(L, true); diff --git a/src/voxels/compressed_chunks.cpp b/src/voxels/compressed_chunks.cpp index 9bc5bf7e..46ba800d 100644 --- a/src/voxels/compressed_chunks.cpp +++ b/src/voxels/compressed_chunks.cpp @@ -4,6 +4,7 @@ #include "coders/gzip.hpp" #include "world/files/WorldFiles.hpp" +#include "content/Content.hpp" inline constexpr int HAS_VOXELS = 0x1; inline constexpr int HAS_METADATA = 0x2; @@ -48,7 +49,9 @@ static void read_voxel_data(ByteReader& reader, util::Buffer& dst) { extrle::decode16(rleData.data(), rleData.size(), dst.data()); } -void compressed_chunks::decode(Chunk& chunk, const ubyte* src, size_t size) { +void compressed_chunks::decode( + Chunk& chunk, const ubyte* src, size_t size, const ContentIndices& indices +) { ByteReader reader(src, size); ubyte flags = reader.get(); @@ -58,6 +61,18 @@ void compressed_chunks::decode(Chunk& chunk, const ubyte* src, size_t size) { /// world.get_chunk_data is only available in the main Lua state static util::Buffer voxelData (CHUNK_DATA_LEN); read_voxel_data(reader, voxelData); + // TODO: move somewhere in Chunk + auto src = reinterpret_cast(voxelData.data()); + for (size_t i = 0; i < CHUNK_VOL; i++) { + blockid_t id = dataio::le2h(src[i]);; + if (indices.blocks.get(id) == nullptr) { + throw std::runtime_error( + "block data corruption (chunk: " + std::to_string(chunk.x) + + ", " + std::to_string(chunk.z) + ") at " + + std::to_string(i) + " id: " + std::to_string(id) + ); + } + } chunk.decode(voxelData.data()); chunk.updateHeights(); } diff --git a/src/voxels/compressed_chunks.hpp b/src/voxels/compressed_chunks.hpp index dd00bc66..203cc5ef 100644 --- a/src/voxels/compressed_chunks.hpp +++ b/src/voxels/compressed_chunks.hpp @@ -6,6 +6,7 @@ #include +class ContentIndices; class WorldRegions; namespace compressed_chunks { @@ -15,6 +16,11 @@ namespace compressed_chunks { util::Buffer& rleBuffer ); std::vector encode(const Chunk& chunk); - void decode(Chunk& chunk, const ubyte* src, size_t size); + void decode( + Chunk& chunk, + const ubyte* src, + size_t size, + const ContentIndices& indices + ); void save(int x, int z, std::vector bytes, WorldRegions& regions); }