diff --git a/Cargo.lock b/Cargo.lock index 6693fe38b..508bd3b4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,9 +146,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", "bytes", @@ -219,9 +219,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitmaps" @@ -357,9 +357,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.59" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -402,7 +402,7 @@ checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -945,16 +945,16 @@ dependencies = [ "cpubits", "ctutils", "num-traits", - "rand_core 0.10.0", + "rand_core 0.10.1", "serdect", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", @@ -977,7 +977,7 @@ checksum = "21f41f23de7d24cdbda7f0c4d9c0351f99a4ceb258ef30e5c1927af8987ffe5a" dependencies = [ "crypto-bigint 0.7.3", "libm", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -1051,7 +1051,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid 0.9.6", - "crypto-common 0.1.7", + "crypto-common 0.1.6", "subtle", ] @@ -1401,9 +1401,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -1442,16 +1442,16 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", - "rand_core 0.10.0", + "rand_core 0.10.1", "wasip2", "wasip3", ] [[package]] name = "gimli" -version = "0.33.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e16c5073773ccf057c282be832a59ee53ef5ff98db3aeff7f8314f52ffc196" +checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" dependencies = [ "fnv", "hashbrown 0.16.1", @@ -1977,9 +1977,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ "once_cell", "wasm-bindgen", @@ -2005,9 +2005,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libloading" @@ -2027,9 +2027,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ "libc", ] @@ -2582,9 +2582,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "postcard" @@ -2892,7 +2892,7 @@ dependencies = [ "postcard", "tracing", "tracing-serde-structured", - "wit-bindgen 0.55.0", + "wit-bindgen 0.56.0", ] [[package]] @@ -3028,7 +3028,7 @@ checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "chacha20", "getrandom 0.4.2", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -3052,9 +3052,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rand_xoshiro" @@ -3067,9 +3067,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -3184,7 +3184,7 @@ dependencies = [ "digest 0.11.2", "pkcs1", "pkcs8 0.11.0-rc.11", - "rand_core 0.10.0", + "rand_core 0.10.1", "signature 3.0.0-rc.10", "spki 0.8.0", "zeroize", @@ -3259,9 +3259,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" dependencies = [ "log", "once_cell", @@ -3283,9 +3283,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "ring", "rustls-pki-types", @@ -3534,7 +3534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" dependencies = [ "digest 0.11.2", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -3729,7 +3729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -3848,9 +3848,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" dependencies = [ "bytes", "libc", @@ -4310,9 +4310,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -4323,9 +4323,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4333,9 +4333,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -4346,9 +4346,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -5141,12 +5141,12 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6870386de1813a61406d88749d5897484e2f6fe90a39408a6a94e160d8c72378" +checksum = "7607d30e7e5e8fd5a0695f7cb8b2128829e0bf9dca7a1fe8c4d6ed3ca1058fce" dependencies = [ "bitflags", - "wit-bindgen-rust-macro 0.55.0", + "wit-bindgen-rust-macro 0.56.0", ] [[package]] @@ -5162,9 +5162,9 @@ dependencies = [ [[package]] name = "wit-bindgen-core" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4779c97d3b9dda56600c3404355d404f8c6567fae0c4d8dfeb92f6e9b2c4c8c3" +checksum = "fda3a4ce47c08d27f575d451a60102bab5251776abd0a7a323d1f038eb6339ab" dependencies = [ "anyhow", "heck", @@ -5189,9 +5189,9 @@ dependencies = [ [[package]] name = "wit-bindgen-rust" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a89a98e0efe034f47f5cf86fa8aeb5d6d7175bade32bbba476aeba29541fed9" +checksum = "920a1c8c0f89397431db4900a7bf7c511b78e1b7068289fe812dc76e993f1491" dependencies = [ "anyhow", "heck", @@ -5199,7 +5199,7 @@ dependencies = [ "prettyplease", "syn", "wasm-metadata 0.246.2", - "wit-bindgen-core 0.55.0", + "wit-bindgen-core 0.56.0", "wit-component 0.246.2", ] @@ -5220,9 +5220,9 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b81978b3d68d12116ae8e5ef3d2125c4cb619ea30002ed20cb7549383f6fca9" +checksum = "857a143d2373abfcd31ad946393efe775ed8c90a2a365ce73c61bf38f36a1000" dependencies = [ "anyhow", "macro-string", @@ -5230,8 +5230,8 @@ dependencies = [ "proc-macro2", "quote", "syn", - "wit-bindgen-core 0.55.0", - "wit-bindgen-rust 0.55.0", + "wit-bindgen-core 0.56.0", + "wit-bindgen-rust 0.56.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9155441aa..f63eda2db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,17 +90,16 @@ debug = true strip = false [workspace.dependencies] -tokio = { version = "1.51", default-features = false } +tokio = { version = "1.52", default-features = false } syn = { version = "2.0", default-features = false, features = ["printing"] } - thiserror = "2.0" bytes = "1.11" # Concurrency/Parallelism and Synchronization futures = { version = "0.3", default-features = false, features = ["executor"] } -rayon = "1.11" +rayon = "1.12" crossbeam = "0.8" chrono = "0.4" @@ -181,7 +180,7 @@ ureq = "3.3.0" wasmtime = "43.0" wasmtime-wasi = "43.0" -wit-bindgen = "0.55" +wit-bindgen = "0.56" wasmparser = "0.246" postcard = { version = "1.1", features = ["alloc"] } diff --git a/pumpkin-plugin-api/src/events/player/mod.rs b/pumpkin-plugin-api/src/events/player/mod.rs index 56484b826..b48da803e 100644 --- a/pumpkin-plugin-api/src/events/player/mod.rs +++ b/pumpkin-plugin-api/src/events/player/mod.rs @@ -16,6 +16,7 @@ pub mod player_login; pub mod player_move; pub mod player_permission_check; pub mod player_teleport; +pub mod player_toggle_flight; pub mod player_toggle_sneak; pub mod player_toggle_sprint; @@ -37,5 +38,6 @@ pub use player_login::*; pub use player_move::*; pub use player_permission_check::*; pub use player_teleport::*; +pub use player_toggle_flight::*; pub use player_toggle_sneak::*; pub use player_toggle_sprint::*; diff --git a/pumpkin-plugin-api/src/events/player/player_toggle_flight.rs b/pumpkin-plugin-api/src/events/player/player_toggle_flight.rs new file mode 100644 index 000000000..b7f6b3a86 --- /dev/null +++ b/pumpkin-plugin-api/src/events/player/player_toggle_flight.rs @@ -0,0 +1,21 @@ +use crate::wit::pumpkin::plugin::event::{Event, EventType, PlayerToggleFlightEventData}; + +use super::super::FromIntoEvent; + +/// An event that occurs when a player toggles flight. +pub struct PlayerToggleFlightEvent; +impl FromIntoEvent for PlayerToggleFlightEvent { + const EVENT_TYPE: EventType = EventType::PlayerToggleFlightEvent; + type Data = PlayerToggleFlightEventData; + + fn data_from_event(event: Event) -> Self::Data { + match event { + Event::PlayerToggleFlightEvent(data) => data, + _ => panic!("unexpected event"), + } + } + + fn data_into_event(data: Self::Data) -> Event { + Event::PlayerToggleFlightEvent(data) + } +} diff --git a/pumpkin-plugin-wit/v0.1.0/event.wit b/pumpkin-plugin-wit/v0.1.0/event.wit index 1d3a91d58..4cd6362d2 100644 --- a/pumpkin-plugin-wit/v0.1.0/event.wit +++ b/pumpkin-plugin-wit/v0.1.0/event.wit @@ -161,6 +161,12 @@ interface event { cancelled: bool } + record player-toggle-flight-event-data { + player: player, + is-flying: bool, + cancelled: bool + } + record player-toggle-sprint-event-data { player: player, is-sprinting: bool, @@ -265,6 +271,7 @@ interface event { player-interact-unknown-entity-event, player-interact-event, player-toggle-sneak-event, + player-toggle-flight-event, player-toggle-sprint-event, block-redstone-event, block-break-event, @@ -297,6 +304,7 @@ interface event { player-interact-unknown-entity-event(player-interact-unknown-entity-event-data), player-interact-event(player-interact-event-data), player-toggle-sneak-event(player-toggle-sneak-event-data), + player-toggle-flight-event(player-toggle-flight-event-data), player-toggle-sprint-event(player-toggle-sprint-event-data), block-redstone-event(block-redstone-event-data), block-break-event(block-break-event-data), diff --git a/pumpkin/src/net/bedrock/mod.rs b/pumpkin/src/net/bedrock/mod.rs index a3cf483ff..9403baed5 100644 --- a/pumpkin/src/net/bedrock/mod.rs +++ b/pumpkin/src/net/bedrock/mod.rs @@ -521,7 +521,7 @@ impl BedrockClient { match packet.id { SPlayerAuthInput::PACKET_ID => { if let Ok(input_packet) = SPlayerAuthInput::read(reader) { - self.player_pos_update(player, input_packet).await; + self.player_pos_update(player, input_packet, server).await; } } SLoadingScreen::PACKET_ID => { diff --git a/pumpkin/src/net/bedrock/play.rs b/pumpkin/src/net/bedrock/play.rs index fb7b8a0ff..e42b96d53 100644 --- a/pumpkin/src/net/bedrock/play.rs +++ b/pumpkin/src/net/bedrock/play.rs @@ -24,7 +24,10 @@ use pumpkin_util::{math::position::BlockPos, text::TextComponent}; use crate::{ entity::{EntityBase, player::Player}, net::{DisconnectReason, bedrock::BedrockClient}, - plugin::player::{player_chat::PlayerChatEvent, player_command_send::PlayerCommandSendEvent}, + plugin::player::{ + player_chat::PlayerChatEvent, player_command_send::PlayerCommandSendEvent, + player_toggle_flight_event::PlayerToggleFlightEvent, + }, server::{Server, seasonal_events}, world::chunker::{self}, }; @@ -76,7 +79,12 @@ impl BedrockClient { } } - pub async fn player_pos_update(&self, player: &Arc, packet: SPlayerAuthInput) { + pub async fn player_pos_update( + &self, + player: &Arc, + packet: SPlayerAuthInput, + server: &Server, + ) { if !player.has_client_loaded() { return; } @@ -98,11 +106,35 @@ impl BedrockClient { } if input_data.get(InputData::StartFlying) { - player.abilities.lock().await.flying = true; - player.send_abilities_update().await; + let mut abilities = player.abilities.lock().await; + if !abilities.flying { + send_cancellable! {{ + server; + PlayerToggleFlightEvent::new(player.clone(), true); + 'after: { + abilities.flying = true; + player.send_abilities_update().await; + } + 'cancelled: { + player.send_abilities_update().await; + } + }} + } } else if input_data.get(InputData::StopFlying) { - player.abilities.lock().await.flying = false; - player.send_abilities_update().await; + let mut abilities = player.abilities.lock().await; + if abilities.flying { + send_cancellable! {{ + server; + PlayerToggleFlightEvent::new(player.clone(), false); + 'after: { + abilities.flying = false; + player.send_abilities_update().await; + } + 'cancelled: { + player.send_abilities_update().await; + } + }} + } } if input_data.get(InputData::StartSneaking) { diff --git a/pumpkin/src/net/java/mod.rs b/pumpkin/src/net/java/mod.rs index 81662b04b..ef329022e 100644 --- a/pumpkin/src/net/java/mod.rs +++ b/pumpkin/src/net/java/mod.rs @@ -766,8 +766,12 @@ impl JavaClient { .await; } id if id == SPlayerAbilities::to_id(version) => { - self.handle_player_abilities(player, SPlayerAbilities::read(payload, &version)?) - .await; + self.handle_player_abilities( + player, + SPlayerAbilities::read(payload, &version)?, + server, + ) + .await; } id if id == SPlayerAction::to_id(version) => { self.handle_player_action(player, SPlayerAction::read(payload, &version)?, server) diff --git a/pumpkin/src/net/java/play.rs b/pumpkin/src/net/java/play.rs index 0b38c0dda..1583d363f 100644 --- a/pumpkin/src/net/java/play.rs +++ b/pumpkin/src/net/java/play.rs @@ -30,7 +30,9 @@ use crate::plugin::player::player_interact_entity_event::PlayerInteractEntityEve use crate::plugin::player::player_interact_event::{InteractAction, PlayerInteractEvent}; use crate::plugin::player::player_interact_unknown_entity_event::PlayerInteractUnknownEntityEvent; use crate::plugin::player::player_move::PlayerMoveEvent; +use crate::plugin::player::player_toggle_flight_event::PlayerToggleFlightEvent; use crate::plugin::player::player_toggle_sneak_event::PlayerToggleSneakEvent; + use crate::plugin::player::player_toggle_sprint_event::PlayerToggleSprintEvent; use crate::server::{Server, seasonal_events}; use crate::world::{World, chunker}; @@ -1970,17 +1972,29 @@ impl JavaClient { pub async fn handle_player_abilities( &self, - player: &Player, + player: &Arc, player_abilities: SPlayerAbilities, + server: &Server, ) { let mut abilities = player.abilities.lock().await; // Set the flying ability let flying = player_abilities.flags & 0x02 != 0 && abilities.allow_flying; - if flying { - player.living_entity.fall_distance.store(0.0); + if abilities.flying != flying { + send_cancellable! {{ + server; + PlayerToggleFlightEvent::new(player.clone(), flying); + 'after: { + if event.is_flying { + player.living_entity.fall_distance.store(0.0); + } + abilities.flying = event.is_flying; + } + 'cancelled: { + player.send_abilities_update().await; + } + }} } - abilities.flying = flying; } pub async fn handle_play_ping_request(&self, request: SPlayPingRequest) { diff --git a/pumpkin/src/plugin/api/events/player/mod.rs b/pumpkin/src/plugin/api/events/player/mod.rs index 8a933c0da..44b49793e 100644 --- a/pumpkin/src/plugin/api/events/player/mod.rs +++ b/pumpkin/src/plugin/api/events/player/mod.rs @@ -17,6 +17,7 @@ pub mod player_login; pub mod player_move; pub mod player_permission_check; pub mod player_teleport; +pub mod player_toggle_flight_event; pub mod player_toggle_sneak_event; pub mod player_toggle_sprint_event; diff --git a/pumpkin/src/plugin/api/events/player/player_toggle_flight_event.rs b/pumpkin/src/plugin/api/events/player/player_toggle_flight_event.rs new file mode 100644 index 000000000..40f646d1e --- /dev/null +++ b/pumpkin/src/plugin/api/events/player/player_toggle_flight_event.rs @@ -0,0 +1,44 @@ +use pumpkin_macros::{Event, cancellable}; +use std::sync::Arc; + +use crate::entity::player::Player; + +use super::PlayerEvent; + +/// An event that occurs when a player toggles their flight state. +/// +/// This event contains the player and their new flight state. +/// It is cancellable to prevent the flight state change. +#[cancellable] +#[derive(Event, Clone)] +pub struct PlayerToggleFlightEvent { + /// The player who toggled their flight state. + pub player: Arc, + + /// The new flight state of the player. + pub is_flying: bool, +} + +impl PlayerToggleFlightEvent { + /// Creates a new instance of `PlayerToggleFlightEvent`. + /// + /// # Arguments + /// - `player`: A reference to the player who toggled their flight state. + /// - `is_flying`: The new flight state. + /// + /// # Returns + /// A new instance of `PlayerToggleFlightEvent`. + pub const fn new(player: Arc, is_flying: bool) -> Self { + Self { + player, + is_flying, + cancelled: false, + } + } +} + +impl PlayerEvent for PlayerToggleFlightEvent { + fn get_player(&self) -> &Arc { + &self.player + } +} diff --git a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs index 24ad16854..29e94c1f2 100644 --- a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs +++ b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/context.rs @@ -57,6 +57,7 @@ async fn register_player_event( player_join::PlayerJoinEvent, player_leave::PlayerLeaveEvent, player_login::PlayerLoginEvent, player_move::PlayerMoveEvent, player_permission_check::PlayerPermissionCheckEvent, player_teleport::PlayerTeleportEvent, + player_toggle_flight_event::PlayerToggleFlightEvent, player_toggle_sneak_event::PlayerToggleSneakEvent, player_toggle_sprint_event::PlayerToggleSprintEvent, }; @@ -140,6 +141,10 @@ async fn register_player_event( register_typed_event::(resource, handler, priority, blocking) .await; } + EventType::PlayerToggleFlightEvent => { + register_typed_event::(resource, handler, priority, blocking) + .await; + } EventType::PlayerToggleSprintEvent => { register_typed_event::(resource, handler, priority, blocking) .await; diff --git a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/events/player.rs b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/events/player.rs index e8004c436..b3b37c5ec 100644 --- a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/events/player.rs +++ b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1_0/events/player.rs @@ -18,7 +18,8 @@ use crate::plugin::{ PlayerInteractUnknownEntityEventData, PlayerItemHeldEventData, PlayerJoinEventData, PlayerLeaveEventData, PlayerLoginEventData, PlayerMoveEventData, PlayerPermissionCheckEventData, PlayerTeleportEventData, - PlayerToggleSneakEventData, PlayerToggleSprintEventData, + PlayerToggleFlightEventData, PlayerToggleSneakEventData, + PlayerToggleSprintEventData, }, }, }, @@ -41,6 +42,7 @@ use crate::plugin::{ player_move::PlayerMoveEvent, player_permission_check::PlayerPermissionCheckEvent, player_teleport::PlayerTeleportEvent, + player_toggle_flight_event::PlayerToggleFlightEvent, player_toggle_sneak_event::PlayerToggleSneakEvent, player_toggle_sprint_event::PlayerToggleSprintEvent, }, @@ -625,6 +627,31 @@ impl ToFromV0_1_0WasmEvent for PlayerToggleSneakEvent { } } +impl ToFromV0_1_0WasmEvent for PlayerToggleFlightEvent { + fn to_v0_1_0_wasm_event(&self, state: &mut PluginHostState) -> Event { + let player = state + .add_player(self.player.clone()) + .expect("failed to add player resource"); + + Event::PlayerToggleFlightEvent(PlayerToggleFlightEventData { + player, + is_flying: self.is_flying, + cancelled: self.cancelled, + }) + } + + fn from_v0_1_0_wasm_event(event: Event, state: &mut PluginHostState) -> Self { + match event { + Event::PlayerToggleFlightEvent(data) => Self { + player: consume_player(state, &data.player), + is_flying: data.is_flying, + cancelled: data.cancelled, + }, + _ => panic!("unexpected event type"), + } + } +} + impl ToFromV0_1_0WasmEvent for PlayerToggleSprintEvent { fn to_v0_1_0_wasm_event(&self, state: &mut PluginHostState) -> Event { let player = state