{"record":{"id":"995e7fd121e1be55","repo":"Pumpkin-MC/Pumpkin","slug":"unexpected-event","errorCode":null,"errorMessage":"unexpected event","messagePattern":"unexpected event","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/pumpkin-plugin-api/src/events/entity/entity_death.rs","lineNumber":16,"sourceCode":"use crate::wit::pumpkin::plugin::event::{\n    EntityDeathEventData, Event, EventType, PlayerDeathEventData,\n};\n\nuse super::super::FromIntoEvent;\n\n/// Event triggered when an entity dies.\npub struct EntityDeathEvent;\nimpl FromIntoEvent for EntityDeathEvent {\n    const EVENT_TYPE: EventType = EventType::EntityDeathEvent;\n    type Data = EntityDeathEventData;\n\n    fn data_from_event(event: Event) -> Self::Data {\n        match event {\n            Event::EntityDeathEvent(data) => data,\n            _ => panic!(\"unexpected event\"),\n        }\n    }\n\n    fn data_into_event(data: Self::Data) -> Event {\n        Event::EntityDeathEvent(data)\n    }\n}\n\n/// Event triggered when a player dies.\npub struct PlayerDeathEvent;\nimpl FromIntoEvent for PlayerDeathEvent {\n    const EVENT_TYPE: EventType = EventType::PlayerDeathEvent;\n    type Data = PlayerDeathEventData;\n\n    fn data_from_event(event: Event) -> Self::Data {\n        match event {\n            Event::PlayerDeathEvent(data) => data,\n            _ => panic!(\"unexpected event\"),","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin-plugin-api/src/events/entity/entity_death.rs#L1-L34","documentation":"A panic in EntityDeathEvent's data_from_event: the trait converts a generic Event enum into this event's typed Data, and any variant other than Event::EntityDeathEvent hits the catch-all `_ => panic!(\"unexpected event\")`. This is an internal invariant violation by the event dispatcher.","triggerScenarios":"The event bus dispatches an Event whose variant does not match EVENT_TYPE to EntityDeathEvent's data_from_event.","commonSituations":"A plugin/event-dispatcher bug routing events by the wrong EventType, or a mismatch between registered handler type and the emitted event variant after an API version change.","solutions":["Verify the dispatcher sends Event::EntityDeathEvent to handlers registered for EventType::EntityDeathEvent","Check pumpkin-plugin-api version alignment between the dispatcher and plugin","Report/fix the routing code; replace panic with a logged error in downstream forks"],"exampleFix":"// before\n_ => panic!(\"unexpected event\"),\n// after\nother => {\n    log::error!(\"EntityDeathEvent handler received {:?}\", other);\n    EntityDeathEventData::default()\n}","handlingStrategy":"type-guard","validationCode":"fn is_entity_death(event: &Event) -> bool { matches!(event, Event::EntityDeathEvent(_)) }","typeGuard":"fn as_entity_death(event: Event) -> Option<EntityDeathEventData> { match event { Event::EntityDeathEvent(d) => Some(d), _ => None } }","tryCatchPattern":"std::panic::catch_unwind(|| dispatch(event)).unwrap_or_else(|_| log_dispatch_bug_and_skip())","preventionTips":["Register handlers with the exact EventType they implement","Keep pumpkin-plugin-api versions in sync across dispatcher and plugins","Replace panics with logged errors when forking event conversion code"],"tags":["panic","event-dispatch","internal-invariant","plugin-api"],"backgroundTag":"internal-invariant-violation","analyzedSha":"8d4639e25a57c15e47448ec327c780d41bbf2356","analyzedAt":"2026-09-09T15:32:22.916Z","contentChangedAt":"2026-09-09T15:32:22.916Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}