add chunk data validity check to world.set_chunk_data
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
#include "assets/AssetsLoader.hpp"
|
#include "assets/AssetsLoader.hpp"
|
||||||
#include "coders/json.hpp"
|
#include "coders/json.hpp"
|
||||||
|
#include "content/Content.hpp"
|
||||||
#include "engine/Engine.hpp"
|
#include "engine/Engine.hpp"
|
||||||
#include "files/WorldFiles.hpp"
|
#include "files/WorldFiles.hpp"
|
||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
@@ -181,7 +182,7 @@ static int l_set_chunk_data(lua::State* L) {
|
|||||||
return lua::pushboolean(L, false);
|
return lua::pushboolean(L, false);
|
||||||
}
|
}
|
||||||
compressed_chunks::decode(
|
compressed_chunks::decode(
|
||||||
*chunk, buffer.data(), buffer.size()
|
*chunk, buffer.data(), buffer.size(), *content->getIndices()
|
||||||
);
|
);
|
||||||
if (controller->getChunksController()->lighting == nullptr) {
|
if (controller->getChunksController()->lighting == nullptr) {
|
||||||
return lua::pushboolean(L, true);
|
return lua::pushboolean(L, true);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "coders/rle.hpp"
|
#include "coders/rle.hpp"
|
||||||
#include "coders/gzip.hpp"
|
#include "coders/gzip.hpp"
|
||||||
|
#include "content/Content.hpp"
|
||||||
#include "files/WorldFiles.hpp"
|
#include "files/WorldFiles.hpp"
|
||||||
|
|
||||||
inline constexpr int HAS_VOXELS = 0x1;
|
inline constexpr int HAS_VOXELS = 0x1;
|
||||||
@@ -48,7 +48,9 @@ static void read_voxel_data(ByteReader& reader, util::Buffer<ubyte>& dst) {
|
|||||||
extrle::decode16(rleData.data(), rleData.size(), dst.data());
|
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);
|
ByteReader reader(src, size);
|
||||||
|
|
||||||
ubyte flags = reader.get();
|
ubyte flags = reader.get();
|
||||||
@@ -58,6 +60,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
|
/// world.get_chunk_data is only available in the main Lua state
|
||||||
static util::Buffer<ubyte> voxelData (CHUNK_DATA_LEN);
|
static util::Buffer<ubyte> voxelData (CHUNK_DATA_LEN);
|
||||||
read_voxel_data(reader, voxelData);
|
read_voxel_data(reader, voxelData);
|
||||||
|
// TODO: move somewhere in Chunk
|
||||||
|
auto src = reinterpret_cast<const uint16_t*>(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.decode(voxelData.data());
|
||||||
chunk.updateHeights();
|
chunk.updateHeights();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
class ContentIndices;
|
||||||
class WorldRegions;
|
class WorldRegions;
|
||||||
|
|
||||||
namespace compressed_chunks {
|
namespace compressed_chunks {
|
||||||
@@ -15,6 +16,11 @@ namespace compressed_chunks {
|
|||||||
util::Buffer<ubyte>& rleBuffer
|
util::Buffer<ubyte>& rleBuffer
|
||||||
);
|
);
|
||||||
std::vector<ubyte> encode(const Chunk& chunk);
|
std::vector<ubyte> 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<ubyte> bytes, WorldRegions& regions);
|
void save(int x, int z, std::vector<ubyte> bytes, WorldRegions& regions);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user