{"record":{"id":"c8d36e8b721c30a0","repo":"egametang/ET","slug":"invalid-magic-header-magic","errorCode":null,"errorMessage":"Invalid magic {header.magic}","messagePattern":"Invalid magic (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"Packages/cn.etetet.recast/Scripts/Core/Share/Detour/Io/DtMeshSetReader.cs","lineNumber":83,"sourceCode":"                throw new IOException(\"Invalid number of verts per poly \" + header.maxVertsPerPoly);\n            }\n\n            bool cCompatibility = header.version == NavMeshSetHeader.NAVMESHSET_VERSION;\n            DtNavMesh mesh = new DtNavMesh(header.option, header.maxVertsPerPoly);\n            ReadTiles(bb, is32Bit, header, cCompatibility, mesh);\n            return mesh;\n        }\n\n        private NavMeshSetHeader ReadHeader(RcByteBuffer bb, int maxVertsPerPoly)\n        {\n            NavMeshSetHeader header = new NavMeshSetHeader();\n            header.magic = bb.GetInt();\n            if (header.magic != NavMeshSetHeader.NAVMESHSET_MAGIC)\n            {\n                header.magic = IOUtils.SwapEndianness(header.magic);\n                if (header.magic != NavMeshSetHeader.NAVMESHSET_MAGIC)\n                {\n                    throw new IOException(\"Invalid magic \" + header.magic);\n                }\n\n                bb.Order(bb.Order() == RcByteOrder.BIG_ENDIAN ? RcByteOrder.LITTLE_ENDIAN : RcByteOrder.BIG_ENDIAN);\n            }\n\n            header.version = bb.GetInt();\n            if (header.version != NavMeshSetHeader.NAVMESHSET_VERSION && header.version != NavMeshSetHeader.NAVMESHSET_VERSION_RECAST4J_1\n                                                                      && header.version != NavMeshSetHeader.NAVMESHSET_VERSION_RECAST4J)\n            {\n                throw new IOException(\"Invalid version \" + header.version);\n            }\n\n            header.numTiles = bb.GetInt();\n            header.option = paramReader.Read(bb);\n            header.maxVertsPerPoly = maxVertsPerPoly;\n            if (header.version == NavMeshSetHeader.NAVMESHSET_VERSION_RECAST4J)\n            {\n                header.maxVertsPerPoly = bb.GetInt();","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/egametang/ET/blob/5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f/Packages/cn.etetet.recast/Scripts/Core/Share/Detour/Io/DtMeshSetReader.cs#L65-L101","documentation":"Thrown by DtMeshSetReader.ReadHeader when the first int is not the navmesh-set magic (NAVMESHSET_MAGIC) even after an endianness swap. The set magic marks a multi-tile navmesh set file; its absence means the input is not a set file (e.g., it is a single tile mesh, an OBJ, or corrupt).","triggerScenarios":"Loading a single-tile DtMeshData blob through the set reader; pointing at a non-navmesh file; a truncated or re-encoded asset.","commonSituations":"Wrong reader selected for the file kind; corrupt asset; wrong file extension mapping.","solutions":["Use DtMeshDataReader for single-tile blobs and DtMeshSetReader for set files.","Verify the file header bytes match NAVMESHSET_MAGIC before reading.","Re-export the set file from a supported tool and confirm round-trip loading."],"exampleFix":"// before\nvar mesh = setReader.Read(bb); // file is actually a single tile\n\n// after\nvar data = meshDataReader.Read(bb, nvp, is32Bit);\nvar mesh = new DtNavMesh();\nmesh.AddTile(data, 0, 0);","handlingStrategy":"validation","validationCode":"int magic = BitConverter.ToInt32(chunk, 0);\nif (magic != NavMeshSetHeader.NAVMESHSET_MAGIC &&\n    IOUtils.SwapEndianness(magic) != NavMeshSetHeader.NAVMESHSET_MAGIC)\n    throw new InvalidDataException(\"Not a navmesh set file\");","typeGuard":"static bool IsSetMagic(int m)\n    => m == NavMeshSetHeader.NAVMESHSET_MAGIC || IOUtils.SwapEndianness(m) == NavMeshSetHeader.NAVMESHSET_MAGIC;","tryCatchPattern":"try { var mesh = setReader.Read(bb); }\ncatch (IOException e) when (e.Message.Contains(\"Invalid magic\"))\n{ /* fall back to single-tile reader or reject */ }","preventionTips":["Use the set reader only for set files; the single-tile reader for tile blobs.","Validate the set magic before reading.","Confirm asset integrity if magic is missing."],"tags":["detour","io","serialization","magic","file-format"],"backgroundTag":null,"analyzedSha":"5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f","analyzedAt":"2026-08-13T21:10:40.377Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}