feat(plugin-api): added PlayerToggleFlightEvent

This commit is contained in:
Alexander Medvedev 2026-04-14 21:45:00 +02:00
parent ead5cae611
commit b6ada28585
13 changed files with 235 additions and 78 deletions

120
Cargo.lock generated
View File

@ -146,9 +146,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]] [[package]]
name = "axum" name = "axum"
version = "0.8.8" version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
dependencies = [ dependencies = [
"axum-core", "axum-core",
"bytes", "bytes",
@ -219,9 +219,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.11.0" version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
[[package]] [[package]]
name = "bitmaps" name = "bitmaps"
@ -357,9 +357,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.59" version = "1.2.60"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"jobserver", "jobserver",
@ -402,7 +402,7 @@ checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cpufeatures 0.3.0", "cpufeatures 0.3.0",
"rand_core 0.10.0", "rand_core 0.10.1",
] ]
[[package]] [[package]]
@ -945,16 +945,16 @@ dependencies = [
"cpubits", "cpubits",
"ctutils", "ctutils",
"num-traits", "num-traits",
"rand_core 0.10.0", "rand_core 0.10.1",
"serdect", "serdect",
"zeroize", "zeroize",
] ]
[[package]] [[package]]
name = "crypto-common" name = "crypto-common"
version = "0.1.7" version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [ dependencies = [
"generic-array", "generic-array",
"typenum", "typenum",
@ -977,7 +977,7 @@ checksum = "21f41f23de7d24cdbda7f0c4d9c0351f99a4ceb258ef30e5c1927af8987ffe5a"
dependencies = [ dependencies = [
"crypto-bigint 0.7.3", "crypto-bigint 0.7.3",
"libm", "libm",
"rand_core 0.10.0", "rand_core 0.10.1",
] ]
[[package]] [[package]]
@ -1051,7 +1051,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [ dependencies = [
"block-buffer 0.10.4", "block-buffer 0.10.4",
"const-oid 0.9.6", "const-oid 0.9.6",
"crypto-common 0.1.7", "crypto-common 0.1.6",
"subtle", "subtle",
] ]
@ -1401,9 +1401,9 @@ dependencies = [
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
dependencies = [ dependencies = [
"typenum", "typenum",
"version_check", "version_check",
@ -1442,16 +1442,16 @@ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"r-efi 6.0.0", "r-efi 6.0.0",
"rand_core 0.10.0", "rand_core 0.10.1",
"wasip2", "wasip2",
"wasip3", "wasip3",
] ]
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.33.1" version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19e16c5073773ccf057c282be832a59ee53ef5ff98db3aeff7f8314f52ffc196" checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c"
dependencies = [ dependencies = [
"fnv", "fnv",
"hashbrown 0.16.1", "hashbrown 0.16.1",
@ -1977,9 +1977,9 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.94" version = "0.3.95"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"wasm-bindgen", "wasm-bindgen",
@ -2005,9 +2005,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.184" version = "0.2.185"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"
[[package]] [[package]]
name = "libloading" name = "libloading"
@ -2027,9 +2027,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.15" version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -2582,9 +2582,9 @@ dependencies = [
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.32" version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
[[package]] [[package]]
name = "postcard" name = "postcard"
@ -2892,7 +2892,7 @@ dependencies = [
"postcard", "postcard",
"tracing", "tracing",
"tracing-serde-structured", "tracing-serde-structured",
"wit-bindgen 0.55.0", "wit-bindgen 0.56.0",
] ]
[[package]] [[package]]
@ -3028,7 +3028,7 @@ checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
dependencies = [ dependencies = [
"chacha20", "chacha20",
"getrandom 0.4.2", "getrandom 0.4.2",
"rand_core 0.10.0", "rand_core 0.10.1",
] ]
[[package]] [[package]]
@ -3052,9 +3052,9 @@ dependencies = [
[[package]] [[package]]
name = "rand_core" name = "rand_core"
version = "0.10.0" version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
[[package]] [[package]]
name = "rand_xoshiro" name = "rand_xoshiro"
@ -3067,9 +3067,9 @@ dependencies = [
[[package]] [[package]]
name = "rayon" name = "rayon"
version = "1.11.0" version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
dependencies = [ dependencies = [
"either", "either",
"rayon-core", "rayon-core",
@ -3184,7 +3184,7 @@ dependencies = [
"digest 0.11.2", "digest 0.11.2",
"pkcs1", "pkcs1",
"pkcs8 0.11.0-rc.11", "pkcs8 0.11.0-rc.11",
"rand_core 0.10.0", "rand_core 0.10.1",
"signature 3.0.0-rc.10", "signature 3.0.0-rc.10",
"spki 0.8.0", "spki 0.8.0",
"zeroize", "zeroize",
@ -3259,9 +3259,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.37" version = "0.23.38"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21"
dependencies = [ dependencies = [
"log", "log",
"once_cell", "once_cell",
@ -3283,9 +3283,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
version = "0.103.10" version = "0.103.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06"
dependencies = [ dependencies = [
"ring", "ring",
"rustls-pki-types", "rustls-pki-types",
@ -3534,7 +3534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3"
dependencies = [ dependencies = [
"digest 0.11.2", "digest 0.11.2",
"rand_core 0.10.0", "rand_core 0.10.1",
] ]
[[package]] [[package]]
@ -3729,7 +3729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [ dependencies = [
"fastrand", "fastrand",
"getrandom 0.3.4", "getrandom 0.4.2",
"once_cell", "once_cell",
"rustix 1.1.4", "rustix 1.1.4",
"windows-sys 0.61.2", "windows-sys 0.61.2",
@ -3848,9 +3848,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.51.1" version = "1.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776"
dependencies = [ dependencies = [
"bytes", "bytes",
"libc", "libc",
@ -4310,9 +4310,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.117" version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@ -4323,9 +4323,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.117" version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -4333,9 +4333,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.117" version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"proc-macro2", "proc-macro2",
@ -4346,9 +4346,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.117" version = "0.2.118"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -5141,12 +5141,12 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen" name = "wit-bindgen"
version = "0.55.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6870386de1813a61406d88749d5897484e2f6fe90a39408a6a94e160d8c72378" checksum = "7607d30e7e5e8fd5a0695f7cb8b2128829e0bf9dca7a1fe8c4d6ed3ca1058fce"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"wit-bindgen-rust-macro 0.55.0", "wit-bindgen-rust-macro 0.56.0",
] ]
[[package]] [[package]]
@ -5162,9 +5162,9 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen-core" name = "wit-bindgen-core"
version = "0.55.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4779c97d3b9dda56600c3404355d404f8c6567fae0c4d8dfeb92f6e9b2c4c8c3" checksum = "fda3a4ce47c08d27f575d451a60102bab5251776abd0a7a323d1f038eb6339ab"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"heck", "heck",
@ -5189,9 +5189,9 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen-rust" name = "wit-bindgen-rust"
version = "0.55.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a89a98e0efe034f47f5cf86fa8aeb5d6d7175bade32bbba476aeba29541fed9" checksum = "920a1c8c0f89397431db4900a7bf7c511b78e1b7068289fe812dc76e993f1491"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"heck", "heck",
@ -5199,7 +5199,7 @@ dependencies = [
"prettyplease", "prettyplease",
"syn", "syn",
"wasm-metadata 0.246.2", "wasm-metadata 0.246.2",
"wit-bindgen-core 0.55.0", "wit-bindgen-core 0.56.0",
"wit-component 0.246.2", "wit-component 0.246.2",
] ]
@ -5220,9 +5220,9 @@ dependencies = [
[[package]] [[package]]
name = "wit-bindgen-rust-macro" name = "wit-bindgen-rust-macro"
version = "0.55.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b81978b3d68d12116ae8e5ef3d2125c4cb619ea30002ed20cb7549383f6fca9" checksum = "857a143d2373abfcd31ad946393efe775ed8c90a2a365ce73c61bf38f36a1000"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"macro-string", "macro-string",
@ -5230,8 +5230,8 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn",
"wit-bindgen-core 0.55.0", "wit-bindgen-core 0.56.0",
"wit-bindgen-rust 0.55.0", "wit-bindgen-rust 0.56.0",
] ]
[[package]] [[package]]

View File

@ -90,17 +90,16 @@ debug = true
strip = false strip = false
[workspace.dependencies] [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"] } syn = { version = "2.0", default-features = false, features = ["printing"] }
thiserror = "2.0" thiserror = "2.0"
bytes = "1.11" bytes = "1.11"
# Concurrency/Parallelism and Synchronization # Concurrency/Parallelism and Synchronization
futures = { version = "0.3", default-features = false, features = ["executor"] } futures = { version = "0.3", default-features = false, features = ["executor"] }
rayon = "1.11" rayon = "1.12"
crossbeam = "0.8" crossbeam = "0.8"
chrono = "0.4" chrono = "0.4"
@ -181,7 +180,7 @@ ureq = "3.3.0"
wasmtime = "43.0" wasmtime = "43.0"
wasmtime-wasi = "43.0" wasmtime-wasi = "43.0"
wit-bindgen = "0.55" wit-bindgen = "0.56"
wasmparser = "0.246" wasmparser = "0.246"
postcard = { version = "1.1", features = ["alloc"] } postcard = { version = "1.1", features = ["alloc"] }

View File

@ -16,6 +16,7 @@ pub mod player_login;
pub mod player_move; pub mod player_move;
pub mod player_permission_check; pub mod player_permission_check;
pub mod player_teleport; pub mod player_teleport;
pub mod player_toggle_flight;
pub mod player_toggle_sneak; pub mod player_toggle_sneak;
pub mod player_toggle_sprint; pub mod player_toggle_sprint;
@ -37,5 +38,6 @@ pub use player_login::*;
pub use player_move::*; pub use player_move::*;
pub use player_permission_check::*; pub use player_permission_check::*;
pub use player_teleport::*; pub use player_teleport::*;
pub use player_toggle_flight::*;
pub use player_toggle_sneak::*; pub use player_toggle_sneak::*;
pub use player_toggle_sprint::*; pub use player_toggle_sprint::*;

View File

@ -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)
}
}

View File

@ -161,6 +161,12 @@ interface event {
cancelled: bool cancelled: bool
} }
record player-toggle-flight-event-data {
player: player,
is-flying: bool,
cancelled: bool
}
record player-toggle-sprint-event-data { record player-toggle-sprint-event-data {
player: player, player: player,
is-sprinting: bool, is-sprinting: bool,
@ -265,6 +271,7 @@ interface event {
player-interact-unknown-entity-event, player-interact-unknown-entity-event,
player-interact-event, player-interact-event,
player-toggle-sneak-event, player-toggle-sneak-event,
player-toggle-flight-event,
player-toggle-sprint-event, player-toggle-sprint-event,
block-redstone-event, block-redstone-event,
block-break-event, block-break-event,
@ -297,6 +304,7 @@ interface event {
player-interact-unknown-entity-event(player-interact-unknown-entity-event-data), player-interact-unknown-entity-event(player-interact-unknown-entity-event-data),
player-interact-event(player-interact-event-data), player-interact-event(player-interact-event-data),
player-toggle-sneak-event(player-toggle-sneak-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), player-toggle-sprint-event(player-toggle-sprint-event-data),
block-redstone-event(block-redstone-event-data), block-redstone-event(block-redstone-event-data),
block-break-event(block-break-event-data), block-break-event(block-break-event-data),

View File

@ -521,7 +521,7 @@ impl BedrockClient {
match packet.id { match packet.id {
SPlayerAuthInput::PACKET_ID => { SPlayerAuthInput::PACKET_ID => {
if let Ok(input_packet) = SPlayerAuthInput::read(reader) { 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 => { SLoadingScreen::PACKET_ID => {

View File

@ -24,7 +24,10 @@ use pumpkin_util::{math::position::BlockPos, text::TextComponent};
use crate::{ use crate::{
entity::{EntityBase, player::Player}, entity::{EntityBase, player::Player},
net::{DisconnectReason, bedrock::BedrockClient}, 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}, server::{Server, seasonal_events},
world::chunker::{self}, world::chunker::{self},
}; };
@ -76,7 +79,12 @@ impl BedrockClient {
} }
} }
pub async fn player_pos_update(&self, player: &Arc<Player>, packet: SPlayerAuthInput) { pub async fn player_pos_update(
&self,
player: &Arc<Player>,
packet: SPlayerAuthInput,
server: &Server,
) {
if !player.has_client_loaded() { if !player.has_client_loaded() {
return; return;
} }
@ -98,12 +106,36 @@ impl BedrockClient {
} }
if input_data.get(InputData::StartFlying) { if input_data.get(InputData::StartFlying) {
player.abilities.lock().await.flying = true; 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; player.send_abilities_update().await;
}
'cancelled: {
player.send_abilities_update().await;
}
}}
}
} else if input_data.get(InputData::StopFlying) { } else if input_data.get(InputData::StopFlying) {
player.abilities.lock().await.flying = false; 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; player.send_abilities_update().await;
} }
'cancelled: {
player.send_abilities_update().await;
}
}}
}
}
if input_data.get(InputData::StartSneaking) { if input_data.get(InputData::StartSneaking) {
entity.set_sneaking(true).await; entity.set_sneaking(true).await;

View File

@ -766,7 +766,11 @@ impl JavaClient {
.await; .await;
} }
id if id == SPlayerAbilities::to_id(version) => { id if id == SPlayerAbilities::to_id(version) => {
self.handle_player_abilities(player, SPlayerAbilities::read(payload, &version)?) self.handle_player_abilities(
player,
SPlayerAbilities::read(payload, &version)?,
server,
)
.await; .await;
} }
id if id == SPlayerAction::to_id(version) => { id if id == SPlayerAction::to_id(version) => {

View File

@ -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_event::{InteractAction, PlayerInteractEvent};
use crate::plugin::player::player_interact_unknown_entity_event::PlayerInteractUnknownEntityEvent; use crate::plugin::player::player_interact_unknown_entity_event::PlayerInteractUnknownEntityEvent;
use crate::plugin::player::player_move::PlayerMoveEvent; 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_sneak_event::PlayerToggleSneakEvent;
use crate::plugin::player::player_toggle_sprint_event::PlayerToggleSprintEvent; use crate::plugin::player::player_toggle_sprint_event::PlayerToggleSprintEvent;
use crate::server::{Server, seasonal_events}; use crate::server::{Server, seasonal_events};
use crate::world::{World, chunker}; use crate::world::{World, chunker};
@ -1970,17 +1972,29 @@ impl JavaClient {
pub async fn handle_player_abilities( pub async fn handle_player_abilities(
&self, &self,
player: &Player, player: &Arc<Player>,
player_abilities: SPlayerAbilities, player_abilities: SPlayerAbilities,
server: &Server,
) { ) {
let mut abilities = player.abilities.lock().await; let mut abilities = player.abilities.lock().await;
// Set the flying ability // Set the flying ability
let flying = player_abilities.flags & 0x02 != 0 && abilities.allow_flying; let flying = player_abilities.flags & 0x02 != 0 && abilities.allow_flying;
if flying { 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); player.living_entity.fall_distance.store(0.0);
} }
abilities.flying = flying; abilities.flying = event.is_flying;
}
'cancelled: {
player.send_abilities_update().await;
}
}}
}
} }
pub async fn handle_play_ping_request(&self, request: SPlayPingRequest) { pub async fn handle_play_ping_request(&self, request: SPlayPingRequest) {

View File

@ -17,6 +17,7 @@ pub mod player_login;
pub mod player_move; pub mod player_move;
pub mod player_permission_check; pub mod player_permission_check;
pub mod player_teleport; pub mod player_teleport;
pub mod player_toggle_flight_event;
pub mod player_toggle_sneak_event; pub mod player_toggle_sneak_event;
pub mod player_toggle_sprint_event; pub mod player_toggle_sprint_event;

View File

@ -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<Player>,
/// 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<Player>, is_flying: bool) -> Self {
Self {
player,
is_flying,
cancelled: false,
}
}
}
impl PlayerEvent for PlayerToggleFlightEvent {
fn get_player(&self) -> &Arc<Player> {
&self.player
}
}

View File

@ -57,6 +57,7 @@ async fn register_player_event(
player_join::PlayerJoinEvent, player_leave::PlayerLeaveEvent, player_join::PlayerJoinEvent, player_leave::PlayerLeaveEvent,
player_login::PlayerLoginEvent, player_move::PlayerMoveEvent, player_login::PlayerLoginEvent, player_move::PlayerMoveEvent,
player_permission_check::PlayerPermissionCheckEvent, player_teleport::PlayerTeleportEvent, player_permission_check::PlayerPermissionCheckEvent, player_teleport::PlayerTeleportEvent,
player_toggle_flight_event::PlayerToggleFlightEvent,
player_toggle_sneak_event::PlayerToggleSneakEvent, player_toggle_sneak_event::PlayerToggleSneakEvent,
player_toggle_sprint_event::PlayerToggleSprintEvent, player_toggle_sprint_event::PlayerToggleSprintEvent,
}; };
@ -140,6 +141,10 @@ async fn register_player_event(
register_typed_event::<PlayerToggleSneakEvent>(resource, handler, priority, blocking) register_typed_event::<PlayerToggleSneakEvent>(resource, handler, priority, blocking)
.await; .await;
} }
EventType::PlayerToggleFlightEvent => {
register_typed_event::<PlayerToggleFlightEvent>(resource, handler, priority, blocking)
.await;
}
EventType::PlayerToggleSprintEvent => { EventType::PlayerToggleSprintEvent => {
register_typed_event::<PlayerToggleSprintEvent>(resource, handler, priority, blocking) register_typed_event::<PlayerToggleSprintEvent>(resource, handler, priority, blocking)
.await; .await;

View File

@ -18,7 +18,8 @@ use crate::plugin::{
PlayerInteractUnknownEntityEventData, PlayerItemHeldEventData, PlayerJoinEventData, PlayerInteractUnknownEntityEventData, PlayerItemHeldEventData, PlayerJoinEventData,
PlayerLeaveEventData, PlayerLoginEventData, PlayerMoveEventData, PlayerLeaveEventData, PlayerLoginEventData, PlayerMoveEventData,
PlayerPermissionCheckEventData, PlayerTeleportEventData, PlayerPermissionCheckEventData, PlayerTeleportEventData,
PlayerToggleSneakEventData, PlayerToggleSprintEventData, PlayerToggleFlightEventData, PlayerToggleSneakEventData,
PlayerToggleSprintEventData,
}, },
}, },
}, },
@ -41,6 +42,7 @@ use crate::plugin::{
player_move::PlayerMoveEvent, player_move::PlayerMoveEvent,
player_permission_check::PlayerPermissionCheckEvent, player_permission_check::PlayerPermissionCheckEvent,
player_teleport::PlayerTeleportEvent, player_teleport::PlayerTeleportEvent,
player_toggle_flight_event::PlayerToggleFlightEvent,
player_toggle_sneak_event::PlayerToggleSneakEvent, player_toggle_sneak_event::PlayerToggleSneakEvent,
player_toggle_sprint_event::PlayerToggleSprintEvent, 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 { impl ToFromV0_1_0WasmEvent for PlayerToggleSprintEvent {
fn to_v0_1_0_wasm_event(&self, state: &mut PluginHostState) -> Event { fn to_v0_1_0_wasm_event(&self, state: &mut PluginHostState) -> Event {
let player = state let player = state