pumpkinplus/modules/mechanics/player/
enderchest.rs1use crate::config::ConfigManager;
12use crate::mechanics::mechanic::Mechanic;
13use crate::{GameMode, InteractAction};
14use pumpkin_plugin_api::events::{EventData, EventHandler, EventPriority, PlayerInteractEvent};
15use pumpkin_plugin_api::{Context, Server};
16use serde::{Deserialize, Serialize};
17
18#[derive(Default)]
20pub struct Enderchest;
21
22impl Mechanic for Enderchest {
23 fn enabled(&self) -> bool {
24 ConfigManager::get()
25 .map(|cm| cm.get_config::<EnderchestConfig>().enabled)
26 .unwrap_or(true)
27 }
28
29 fn events(&self, context: &Context) {
30 context
31 .register_event_handler::<PlayerInteractEvent, _>(
32 Enderchest,
33 EventPriority::Normal,
34 true,
35 )
36 .expect("failed to register enderchest event handler");
37 }
38}
39
40impl EventHandler<PlayerInteractEvent> for Enderchest {
41 fn handle(
42 &self,
43 _server: Server,
44 event: EventData<PlayerInteractEvent>,
45 ) -> EventData<PlayerInteractEvent> {
46 if !self.enabled() {
47 return event;
48 }
49
50 let config: EnderchestConfig = ConfigManager::get()
51 .map(|cm| cm.get_config())
52 .unwrap_or_default();
53
54 let action = InteractAction::from(event.action);
55 if !action.matches_config(&config.actions) {
56 return event;
57 }
58
59 if event.block != "minecraft:ender_chest" {
60 return event;
61 }
62
63 let gamemode = GameMode::from(event.player.get_gamemode());
64 if !gamemode.matches_config(&config.gamemodes) {
65 return event;
66 }
67
68 event
71 }
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct EnderchestConfig {
77 pub enabled: bool,
79 pub gamemodes: Vec<GameMode>,
81 pub actions: Vec<InteractAction>,
83}
84
85impl Default for EnderchestConfig {
86 fn default() -> Self {
87 Self {
88 enabled: false,
89 gamemodes: vec![GameMode::Survival, GameMode::Adventure],
90 actions: vec![InteractAction::RightClickAir],
91 }
92 }
93}