diff --git a/.gitignore b/.gitignore index c6cf1aef6..db30f8c85 100755 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ flamegraph.svg perf.data perf.data.old heaptrack.* + +rustc-ice-* diff --git a/azalea-core/src/bitset.rs b/azalea-core/src/bitset.rs index e7c79467f..de9d00f3a 100755 --- a/azalea-core/src/bitset.rs +++ b/azalea-core/src/bitset.rs @@ -126,26 +126,24 @@ impl From> for BitSet { /// A list of bits with a known fixed size. /// +/// The `N` is the number of bytes reserved for the bitset. You're encouraged to +/// use it like `FixedBitSet<{ 20_usize.div_ceil(8) }>` if you need 20 bits. +/// +/// TODO: this should be changed back to bits once this is resolved: +/// https://github.com/rust-lang/rust/issues/133199#issuecomment-2531645526 +/// /// Note that this is primarily meant for fast serialization and deserialization /// for Minecraft, if you don't need that you should use the `fixedbitset` crate /// since it's approximately 20% faster (since it stores the data as usizes -/// instead of u8s) +/// instead of u8s). #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct FixedBitSet -where - [(); N.div_ceil(8)]: Sized, -{ - data: [u8; N.div_ceil(8)], +pub struct FixedBitSet { + data: [u8; N], } -impl FixedBitSet -where - [u8; N.div_ceil(8)]: Sized, -{ +impl FixedBitSet { pub fn new() -> Self { - FixedBitSet { - data: [0; N.div_ceil(8)], - } + FixedBitSet { data: [0; N] } } #[inline] @@ -159,24 +157,18 @@ where } } -impl AzaleaRead for FixedBitSet -where - [u8; N.div_ceil(8)]: Sized, -{ +impl AzaleaRead for FixedBitSet { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let mut data = [0; N.div_ceil(8)]; - for item in data.iter_mut().take(N.div_ceil(8)) { + let mut data = [0; N]; + for item in data.iter_mut().take(N) { *item = u8::azalea_read(buf)?; } Ok(FixedBitSet { data }) } } -impl AzaleaWrite for FixedBitSet -where - [u8; N.div_ceil(8)]: Sized, -{ +impl AzaleaWrite for FixedBitSet { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - for i in 0..N.div_ceil(8) { + for i in 0..N { self.data[i].azalea_write(buf)?; } Ok(()) diff --git a/azalea-protocol/build.rs b/azalea-protocol/build.rs deleted file mode 100644 index e3bb9c3cd..000000000 --- a/azalea-protocol/build.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::env; -use std::process::Command; - -/// The maximum recommended toolchain version, as a triple. -const TOOLCHAIN_MAX: (u32, u32, u32) = (2024, 11, 11); - -fn main() { - if let Some(toolchain) = toolchain_version() { - // If the toolchain is not nightly, do nothing - if !toolchain.contains("nightly") { - return; - } - - // Warn if the toolchain may cause issues - if !recommended_toolchain(&toolchain).unwrap_or_default() { - println!("cargo::warning=The current Rust version may cause issues, try using: \"nightly-{}-{}-{}\"", TOOLCHAIN_MAX.0, TOOLCHAIN_MAX.1, TOOLCHAIN_MAX.2); - } - } -} - -/// Attempt to get the current toolchain version -fn toolchain_version() -> Option { - // Use the `RUSTUP_TOOLCHAIN` environment variable - if let Ok(toolchain) = env::var("RUSTUP_TOOLCHAIN") { - return Some(toolchain); - } - - // Fallback to running `rustc -V` - let rustc_path = env::var("RUSTC") - .or_else(|_| env::var("CARGO_BUILD_RUSTC")) - .unwrap_or(String::from("rustc")); - - let rustc_command = Command::new(&rustc_path).arg("-V").output().unwrap(); - if rustc_command.status.success() { - String::from_utf8(rustc_command.stdout).ok() - } else { - None - } -} - - -/// Attempt to parse the version of the toolchain, -/// returning `Some(true)` if the toolchain should be fine. -fn recommended_toolchain(toolchain: &str) -> Option { - let mut split = toolchain.split('-'); - while split.next() != Some("nightly") {} - - let year = split.next()?.parse().ok()?; - let month = split.next()?.parse().ok()?; - let day = split.next()?.parse().ok()?; - - Some((year, month, day) <= TOOLCHAIN_MAX) -} diff --git a/azalea-protocol/src/common/client_information.rs b/azalea-protocol/src/common/client_information.rs index 6f5e05e25..f2290fe74 100644 --- a/azalea-protocol/src/common/client_information.rs +++ b/azalea-protocol/src/common/client_information.rs @@ -97,7 +97,7 @@ impl Default for ModelCustomization { impl AzaleaRead for ModelCustomization { fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<7>::azalea_read(buf)?; + let set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { cape: set.index(0), jacket: set.index(1), @@ -112,7 +112,7 @@ impl AzaleaRead for ModelCustomization { impl AzaleaWrite for ModelCustomization { fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<7>::new(); + let mut set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::new(); if self.cape { set.set(0); } diff --git a/azalea-protocol/src/packets/game/c_boss_event.rs b/azalea-protocol/src/packets/game/c_boss_event.rs index e54ab59fb..58d9f4bba 100755 --- a/azalea-protocol/src/packets/game/c_boss_event.rs +++ b/azalea-protocol/src/packets/game/c_boss_event.rs @@ -116,7 +116,7 @@ pub struct Properties { impl AzaleaRead for Properties { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<3>::azalea_read(buf)?; + let set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { darken_screen: set.index(0), play_music: set.index(1), @@ -127,7 +127,7 @@ impl AzaleaRead for Properties { impl AzaleaWrite for Properties { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<3>::new(); + let mut set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::new(); if self.darken_screen { set.set(0); } diff --git a/azalea-protocol/src/packets/game/c_commands.rs b/azalea-protocol/src/packets/game/c_commands.rs index 1a2315597..c0ac27b2b 100755 --- a/azalea-protocol/src/packets/game/c_commands.rs +++ b/azalea-protocol/src/packets/game/c_commands.rs @@ -46,7 +46,7 @@ impl PartialEq for BrigadierNumber { impl AzaleaRead for BrigadierNumber { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let flags = FixedBitSet::<2>::azalea_read(buf)?; + let flags = FixedBitSet::<{ 2_usize.div_ceil(8) }>::azalea_read(buf)?; let min = if flags.index(0) { Some(T::azalea_read(buf)?) } else { @@ -62,7 +62,7 @@ impl AzaleaRead for BrigadierNumber { } impl AzaleaWrite for BrigadierNumber { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut flags = FixedBitSet::<2>::new(); + let mut flags = FixedBitSet::<{ 2_usize.div_ceil(8) }>::new(); if self.min.is_some() { flags.set(0); } @@ -156,7 +156,7 @@ pub struct EntityParser { } impl AzaleaRead for EntityParser { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let flags = FixedBitSet::<2>::azalea_read(buf)?; + let flags = FixedBitSet::<{ 2_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(EntityParser { single: flags.index(0), players_only: flags.index(1), @@ -165,7 +165,7 @@ impl AzaleaRead for EntityParser { } impl AzaleaWrite for EntityParser { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut flags = FixedBitSet::<2>::new(); + let mut flags = FixedBitSet::<{ 2_usize.div_ceil(8) }>::new(); if self.single { flags.set(0); } @@ -180,7 +180,7 @@ impl AzaleaWrite for EntityParser { // TODO: BrigadierNodeStub should have more stuff impl AzaleaRead for BrigadierNodeStub { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let flags = FixedBitSet::<8>::azalea_read(buf)?; + let flags = FixedBitSet::<{ 8_usize.div_ceil(8) }>::azalea_read(buf)?; if flags.index(5) || flags.index(6) || flags.index(7) { warn!("Warning: The flags from a Brigadier node are over 31. This is probably a bug.",); } @@ -239,7 +239,7 @@ impl AzaleaRead for BrigadierNodeStub { impl AzaleaWrite for BrigadierNodeStub { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut flags = FixedBitSet::<4>::new(); + let mut flags = FixedBitSet::<{ 4_usize.div_ceil(8) }>::new(); if self.is_executable { flags.set(2); } diff --git a/azalea-protocol/src/packets/game/c_player_abilities.rs b/azalea-protocol/src/packets/game/c_player_abilities.rs index c32a99fef..fffd320c6 100755 --- a/azalea-protocol/src/packets/game/c_player_abilities.rs +++ b/azalea-protocol/src/packets/game/c_player_abilities.rs @@ -23,7 +23,7 @@ pub struct PlayerAbilitiesFlags { impl AzaleaRead for PlayerAbilitiesFlags { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<4>::azalea_read(buf)?; + let set = FixedBitSet::<{ 4_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(PlayerAbilitiesFlags { invulnerable: set.index(0), flying: set.index(1), @@ -35,7 +35,7 @@ impl AzaleaRead for PlayerAbilitiesFlags { impl AzaleaWrite for PlayerAbilitiesFlags { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<4>::new(); + let mut set = FixedBitSet::<{ 4_usize.div_ceil(8) }>::new(); if self.invulnerable { set.set(0); } diff --git a/azalea-protocol/src/packets/game/c_player_info_update.rs b/azalea-protocol/src/packets/game/c_player_info_update.rs index 73c463d5d..eb0191672 100644 --- a/azalea-protocol/src/packets/game/c_player_info_update.rs +++ b/azalea-protocol/src/packets/game/c_player_info_update.rs @@ -183,7 +183,7 @@ pub struct ActionEnumSet { impl AzaleaRead for ActionEnumSet { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<7>::azalea_read(buf)?; + let set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(ActionEnumSet { add_player: set.index(0), initialize_chat: set.index(1), @@ -199,7 +199,7 @@ impl AzaleaRead for ActionEnumSet { impl AzaleaWrite for ActionEnumSet { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<7>::new(); + let mut set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::new(); if self.add_player { set.set(0); } diff --git a/azalea-protocol/src/packets/game/c_player_position.rs b/azalea-protocol/src/packets/game/c_player_position.rs index d75c7b782..8d19ce368 100755 --- a/azalea-protocol/src/packets/game/c_player_position.rs +++ b/azalea-protocol/src/packets/game/c_player_position.rs @@ -43,7 +43,7 @@ pub struct RelativeMovements { impl AzaleaRead for RelativeMovements { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { // yes minecraft seriously wastes that many bits, smh - let set = FixedBitSet::<32>::azalea_read(buf)?; + let set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(RelativeMovements { x: set.index(0), y: set.index(1), @@ -60,7 +60,7 @@ impl AzaleaRead for RelativeMovements { impl AzaleaWrite for RelativeMovements { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<32>::new(); + let mut set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::new(); let mut set_bit = |index: usize, value: bool| { if value { set.set(index); diff --git a/azalea-protocol/src/packets/game/c_stop_sound.rs b/azalea-protocol/src/packets/game/c_stop_sound.rs index 0a01fa714..aa92c23e6 100755 --- a/azalea-protocol/src/packets/game/c_stop_sound.rs +++ b/azalea-protocol/src/packets/game/c_stop_sound.rs @@ -1,6 +1,6 @@ use std::io::{Cursor, Write}; -use azalea_buf::{BufReadError, AzaleaRead, AzaleaWrite}; +use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError}; use azalea_core::{bitset::FixedBitSet, resource_location::ResourceLocation}; use azalea_protocol_macros::ClientboundGamePacket; @@ -14,7 +14,7 @@ pub struct ClientboundStopSound { impl AzaleaRead for ClientboundStopSound { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<2>::azalea_read(buf)?; + let set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::azalea_read(buf)?; let source = if set.index(0) { Some(SoundSource::azalea_read(buf)?) } else { @@ -32,7 +32,7 @@ impl AzaleaRead for ClientboundStopSound { impl AzaleaWrite for ClientboundStopSound { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<2>::new(); + let mut set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::new(); if self.source.is_some() { set.set(0); } diff --git a/azalea-protocol/src/packets/game/s_chat.rs b/azalea-protocol/src/packets/game/s_chat.rs index 03bafd110..40c7e123b 100755 --- a/azalea-protocol/src/packets/game/s_chat.rs +++ b/azalea-protocol/src/packets/game/s_chat.rs @@ -16,5 +16,5 @@ pub struct ServerboundChat { pub struct LastSeenMessagesUpdate { #[var] pub messages: u32, - pub acknowledged: FixedBitSet<20>, + pub acknowledged: FixedBitSet<{ 20_usize.div_ceil(8) }>, } diff --git a/azalea-protocol/src/packets/game/s_player_abilities.rs b/azalea-protocol/src/packets/game/s_player_abilities.rs index fdf2d8a4e..5e63ef2e9 100755 --- a/azalea-protocol/src/packets/game/s_player_abilities.rs +++ b/azalea-protocol/src/packets/game/s_player_abilities.rs @@ -13,7 +13,7 @@ pub struct ServerboundPlayerAbilities { impl AzaleaRead for ServerboundPlayerAbilities { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<2>::azalea_read(buf)?; + let set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { is_flying: set.index(1), }) @@ -22,7 +22,7 @@ impl AzaleaRead for ServerboundPlayerAbilities { impl AzaleaWrite for ServerboundPlayerAbilities { fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<2>::new(); + let mut set = FixedBitSet::<{ 2_usize.div_ceil(8) }>::new(); if self.is_flying { set.set(1); } diff --git a/azalea-protocol/src/packets/game/s_player_input.rs b/azalea-protocol/src/packets/game/s_player_input.rs index bd4ba9709..6dbd47cd8 100755 --- a/azalea-protocol/src/packets/game/s_player_input.rs +++ b/azalea-protocol/src/packets/game/s_player_input.rs @@ -18,7 +18,7 @@ pub struct ServerboundPlayerInput { impl AzaleaRead for ServerboundPlayerInput { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<7>::azalea_read(buf)?; + let set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { forward: set.index(0), backward: set.index(1), @@ -33,7 +33,7 @@ impl AzaleaRead for ServerboundPlayerInput { impl AzaleaWrite for ServerboundPlayerInput { fn azalea_write(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<7>::new(); + let mut set = FixedBitSet::<{ 7_usize.div_ceil(8) }>::new(); if self.forward { set.set(0); } diff --git a/azalea-protocol/src/packets/game/s_set_command_block.rs b/azalea-protocol/src/packets/game/s_set_command_block.rs index dacb79de4..ea1af6bbe 100755 --- a/azalea-protocol/src/packets/game/s_set_command_block.rs +++ b/azalea-protocol/src/packets/game/s_set_command_block.rs @@ -30,7 +30,7 @@ impl AzaleaRead for ServerboundSetCommandBlock { let command = String::azalea_read(buf)?; let mode = Mode::azalea_read(buf)?; - let set = FixedBitSet::<3>::azalea_read(buf)?; + let set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { pos, command, @@ -48,7 +48,7 @@ impl AzaleaWrite for ServerboundSetCommandBlock { self.command.azalea_write(buf)?; self.mode.azalea_write(buf)?; - let mut set = FixedBitSet::<3>::new(); + let mut set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::new(); if self.track_output { set.set(0); } diff --git a/azalea-protocol/src/packets/game/s_set_structure_block.rs b/azalea-protocol/src/packets/game/s_set_structure_block.rs index 7f05a3a7b..14b403abf 100755 --- a/azalea-protocol/src/packets/game/s_set_structure_block.rs +++ b/azalea-protocol/src/packets/game/s_set_structure_block.rs @@ -71,7 +71,7 @@ pub struct Flags { impl AzaleaRead for Flags { fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result { - let set = FixedBitSet::<3>::azalea_read(buf)?; + let set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::azalea_read(buf)?; Ok(Self { ignore_entities: set.index(0), show_air: set.index(1), @@ -82,7 +82,7 @@ impl AzaleaRead for Flags { impl AzaleaWrite for Flags { fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let mut set = FixedBitSet::<3>::new(); + let mut set = FixedBitSet::<{ 3_usize.div_ceil(8) }>::new(); if self.ignore_entities { set.set(0); } diff --git a/azalea/src/pathfinder/world.rs b/azalea/src/pathfinder/world.rs index 3a004f658..924ee33a9 100644 --- a/azalea/src/pathfinder/world.rs +++ b/azalea/src/pathfinder/world.rs @@ -77,8 +77,8 @@ impl CachedSections { pub struct CachedSection { pub pos: ChunkSectionPos, - pub passable_bitset: FixedBitSet<4096>, - pub solid_bitset: FixedBitSet<4096>, + pub passable_bitset: FixedBitSet<{ 4096_usize.div_ceil(8) }>, + pub solid_bitset: FixedBitSet<{ 4096_usize.div_ceil(8) }>, } impl CachedWorld { @@ -182,8 +182,8 @@ impl CachedWorld { fn calculate_bitsets_for_section(&self, section_pos: ChunkSectionPos) -> Option { self.with_section(section_pos, |section| { - let mut passable_bitset = FixedBitSet::<4096>::new(); - let mut solid_bitset = FixedBitSet::<4096>::new(); + let mut passable_bitset = FixedBitSet::<{ 4096_usize.div_ceil(8) }>::new(); + let mut solid_bitset = FixedBitSet::<{ 4096_usize.div_ceil(8) }>::new(); for i in 0..4096 { let block_state_id = section.get_at_index(i); let block_state = BlockState::try_from(block_state_id).unwrap_or(BlockState::AIR); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index e5458740c..5d56faf9a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,2 @@ [toolchain] -channel = "nightly-2024-11-11" -# channel = "nightly" +channel = "nightly"