{"record":{"id":"4ba6b5b89fbedfb8","repo":"Pumpkin-MC/Pumpkin","slug":"failed-to-add-player-resource-4ba6b5","errorCode":null,"errorMessage":"failed to add player resource","messagePattern":"failed to add player resource","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/entity.rs","lineNumber":524,"sourceCode":"\n    fn from_wasm_event(event: Event, _state: &mut PluginHostState) -> Self {\n        match event {\n            Event::EntityShootBowEvent(data) => Self {\n                entity_id: data.entity_id,\n                weapon_name: data.weapon_name,\n                force: data.force,\n                cancelled: data.cancelled,\n            },\n            _ => panic!(\"unexpected event type\"),\n        }\n    }\n}\n\nimpl ToFromWasmEvent for crate::plugin::api::events::entity::entity_tame::EntityTameEvent {\n    fn to_wasm_event(&self, state: &mut PluginHostState) -> Event {\n        let owner = state\n            .add_player(self.owner.clone())\n            .expect(\"failed to add player resource\");\n        Event::EntityTameEvent(EntityTameEventData {\n            entity_id: self.entity_id,\n            owner,\n            cancelled: self.cancelled,\n        })\n    }\n\n    fn from_wasm_event(event: Event, state: &mut PluginHostState) -> Self {\n        match event {\n            Event::EntityTameEvent(data) => Self {\n                entity_id: data.entity_id,\n                owner: consume_player(state, &data.owner),\n                cancelled: data.cancelled,\n            },\n            _ => panic!(\"unexpected event type\"),\n        }\n    }\n}","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/entity.rs#L506-L542","documentation":"to_wasm_event for EntityTameEvent calls PluginHostState::add_player to register the taming owner (an Arc<Player>) in the WASM resource table and .expect()s success; if the resource cannot be inserted, the host panics with \"failed to add player resource\". add_player can fail when the linear-component resource table cannot allocate a new handle (e.g. table limits) or the store/state is in a bad state, so the tame event can never be serialized for the guest.","triggerScenarios":"An EntityTameEvent fires and state.add_player(self.owner) returns Err — resource-table allocation failure in the wasmtime instance, calling with a PluginHostState whose store is torn down, or a resource handle leak exhausting the table over many events.","commonSituations":"Long-running servers where player/bossbar resources are added without cleanup, eventually hitting wasmtime resource-table limits; plugins crashing mid-event leaving the host state inconsistent.","solutions":["Check whether add_player failures correlate with resource-table exhaustion; ensure consume_player/cleanup_event runs for every added player resource","Update wasmtime/pumpkin to a version that grows the resource table or returns errors gracefully","Ensure the plugin's store/instance is alive and healthy when entity events fire","Replace the .expect with logged error + event skip so one bad conversion doesn't kill the server thread"],"exampleFix":"// before\nlet owner = state\n    .add_player(self.owner.clone())\n    .expect(\"failed to add player resource\");\n// after\nlet owner = match state.add_player(self.owner.clone()) {\n    Ok(o) => o,\n    Err(e) => {\n        log::error!(\"skipping EntityTameEvent: add_player failed: {e}\");\n        return Event::NoEvent; // or propagate an error\n    }\n};","handlingStrategy":"try-catch","validationCode":"// before firing the event, ensure the state/store is usable\nif state.resource_table_is_full() { log::warn!(\"player resource table full; skipping EntityTameEvent\"); return; }","typeGuard":"fn can_add_player(state: &PluginHostState, p: &Arc<Player>) -> bool { !state.is_torn_down() && state.player_table_has_capacity() }","tryCatchPattern":"match state.add_player(owner.clone()) {\n    Ok(h) => build_event(h),\n    Err(e) => log::error!(\"EntityTameEvent dropped: {e}\"), // don't .expect in hot event paths\n}","preventionTips":["Always call consume_player/cleanup_event for every added player resource to avoid table exhaustion","Avoid .expect on resource-table inserts in event hot paths","Monitor resource-table growth on long-running servers","Keep wasmtime updated for resource-table fixes"],"tags":["wasm","wasmtime","resource-table","panic","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-15T23:17:13.987Z"}