{"record":{"id":"fafc485e4667c4a2","repo":"stride3d/stride","slug":"duplicate-collider-added","errorCode":null,"errorMessage":"Duplicate collider added","messagePattern":"Duplicate collider added","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Navigation/NavigationMeshBuilder.cs","lineNumber":57,"sourceCode":"        public NavigationMeshBuilder(NavigationMesh oldNavigationMesh = null)\n        {\n            this.oldNavigationMesh = oldNavigationMesh;\n        }\n\n        /// <summary>\n        /// Adds information about a collider to this builder\n        /// </summary>\n        /// <remarks>\n        /// You can only register a single <see cref=\"StaticColliderComponent\"/> once\n        /// </remarks>\n        /// <exception cref=\"InvalidOperationException\">When trying to register collider data with the same <see cref=\"StaticColliderComponent\"/> twice</exception>\n        /// <param name=\"colliderData\">A collider data object to add</param>\n        public void Add(StaticColliderData colliderData)\n        {\n            lock (colliders)\n            {\n                if (registeredGuids.Contains(colliderData.Component.Id))\n                    throw new InvalidOperationException(\"Duplicate collider added\");\n                colliders.Add(colliderData);\n                registeredGuids.Add(colliderData.Component.Id);\n            }\n        }\n\n        /// <summary>\n        /// Removes a specific collider from the builder\n        /// </summary>\n        /// <param name=\"colliderData\">The collider data object to remove</param>\n        public void Remove(StaticColliderData colliderData)\n        {\n            lock (colliders)\n            {\n                if (!registeredGuids.Contains(colliderData.Component.Id))\n                    throw new InvalidOperationException(\"Trying to remove unregistered collider\");\n                colliders.Remove(colliderData);\n                registeredGuids.Remove(colliderData.Component.Id);\n            }","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Navigation/NavigationMeshBuilder.cs#L39-L75","documentation":"NavigationMeshBuilder.Add registers a static collider for navmesh building, keyed by the component's Id. Throwing InvalidOperationException prevents the same collider component from being added twice, which would produce duplicated geometry in the built navmesh.","triggerScenarios":"Calling Add(StaticColliderData) twice for a component with the same Id — e.g. re-registering on scene reload, double entity initialization, or a component's registration event firing more than once.","commonSituations":"Scene hot-reload or script restart where cleanup (Remove) was skipped; duplicate event subscriptions (Added event firing twice); manually adding colliders that the system already registered automatically.","solutions":["Guard with a membership check before adding, or track your own registration state per component","Ensure the corresponding Remove is called when the component is deactivated/removed before re-adding","Fix duplicate event subscription so registration happens exactly once per component lifetime"],"exampleFix":"// before\nbuilder.Add(colliderData); // may already be registered\n// after\nif (!builderIsRegistered(colliderData.Component.Id))\n    builder.Add(colliderData);","handlingStrategy":"validation","validationCode":"// track registration yourself\nvar registeredIds = new HashSet<Guid>();\nif (registeredIds.Contains(colliderData.Component.Id)) return; // already added\nbuilder.Add(colliderData);\nregisteredIds.Add(colliderData.Component.Id);","typeGuard":"null","tryCatchPattern":"try\n{\n    builder.Add(colliderData);\n}\ncatch (InvalidOperationException)\n{\n    // duplicate registration; safe to ignore or log\n}","preventionTips":["Pair every Add with exactly one Remove in the component lifecycle","Avoid duplicate subscriptions to entity/scene events","Idempotent registration guards (check-then-add) in re-init paths"],"tags":["csharp","duplicate-registration","navigation"],"backgroundTag":"invalid-state-transition","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}