{"record":{"id":"3f6840204554a978","repo":"egametang/ET","slug":"invalid-version","errorCode":null,"errorMessage":"Invalid version","messagePattern":"Invalid version","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"Packages/cn.etetet.recast/Scripts/Core/Share/Detour.TileCache/Io/DtTileCacheLayerHeaderReader.cs","lineNumber":37,"sourceCode":"*/\n\nusing System.IO;\nusing DotRecast.Core;\n\nnamespace DotRecast.Detour.TileCache.Io\n{\n    public class DtTileCacheLayerHeaderReader\n    {\n        public DtTileCacheLayerHeader Read(RcByteBuffer data, bool cCompatibility)\n        {\n            DtTileCacheLayerHeader header = new DtTileCacheLayerHeader();\n            header.magic = data.GetInt();\n            header.version = data.GetInt();\n\n            if (header.magic != DtTileCacheLayerHeader.DT_TILECACHE_MAGIC)\n                throw new IOException(\"Invalid magic\");\n            if (header.version != DtTileCacheLayerHeader.DT_TILECACHE_VERSION)\n                throw new IOException(\"Invalid version\");\n\n            header.tx = data.GetInt();\n            header.ty = data.GetInt();\n            header.tlayer = data.GetInt();\n            \n            header.bmin.x = data.GetFloat();\n            header.bmin.y = data.GetFloat();\n            header.bmin.z = data.GetFloat();\n            header.bmax.x = data.GetFloat();\n            header.bmax.y = data.GetFloat();\n            header.bmax.z = data.GetFloat();\n\n            header.hmin = data.GetShort() & 0xFFFF;\n            header.hmax = data.GetShort() & 0xFFFF;\n            header.width = data.Get() & 0xFF;\n            header.height = data.Get() & 0xFF;\n            header.minx = data.Get() & 0xFF;\n            header.maxx = data.Get() & 0xFF;","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/egametang/ET/blob/5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f/Packages/cn.etetet.recast/Scripts/Core/Share/Detour.TileCache/Io/DtTileCacheLayerHeaderReader.cs#L19-L55","documentation":"After the magic check passes, DtTileCacheLayerHeaderReader.Read verifies the version int equals DT_TILECACHE_VERSION (currently 1). A different version means the layer was written by an incompatible (newer or older) format that this reader cannot parse safely. Thrown as IOException.","triggerScenarios":"Reading a tile-cache layer produced by a different DotRecast/recast4j version whose DT_TILECACHE_VERSION differs; partially overwritten bytes where the version int is corrupt after a valid magic.","commonSituations":"Upgrading DotRecast across a version bump that changed the layer format; loading caches baked on another toolchain/version; cross-version asset pipelines.","solutions":["Re-bake/re-export the tile-cache layers with the DotRecast version that will load them.","Pin producer and consumer to the same DotRecast version in your asset pipeline.","If you must migrate, write a one-time converter that reads the old version and writes the current one."],"exampleFix":"// before: layers baked on DotRecast 1.x loaded by 2.x\nvar layer = builder.DecompressTileCacheLayer(comp, oldBytes, order, cCompat);\n\n// after: re-bake with the consuming version (or run a migration converter)\n// re-export layers so header.version == DtTileCacheLayerHeader.DT_TILECACHE_VERSION","handlingStrategy":"try-catch","validationCode":"int v = buf.GetInt(); // after magic\nif (v != DtTileCacheLayerHeader.DT_TILECACHE_VERSION)\n    throw new InvalidDataException($\"unsupported layer version {v} (expected {DtTileCacheLayerHeader.DT_TILECACHE_VERSION})\");","typeGuard":null,"tryCatchPattern":"try { header = reader.Read(buf, cCompat); }\ncatch (IOException e) when (e.Message == \"Invalid version\")\n{ /* re-bake layer with the current DotRecast version */ }","preventionTips":["Pin producer and consumer DotRecast versions in the asset pipeline.","Re-bake layers after a version bump.","Write a migration converter if old layers must be supported."],"tags":["io","detour-tilecache","serialization","version"],"backgroundTag":null,"analyzedSha":"5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f","analyzedAt":"2026-08-13T21:10:40.377Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}