mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 06:16:04 +00:00
fix for latest nightly by changing the FixedBitSet generic to take bytes instead of bits
This commit is contained in:
parent
2feef49471
commit
097a620de1
17 changed files with 51 additions and 111 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -15,3 +15,5 @@ flamegraph.svg
|
|||
perf.data
|
||||
perf.data.old
|
||||
heaptrack.*
|
||||
|
||||
rustc-ice-*
|
||||
|
|
|
@ -126,26 +126,24 @@ impl From<Vec<u8>> 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<const N: usize>
|
||||
where
|
||||
[(); N.div_ceil(8)]: Sized,
|
||||
{
|
||||
data: [u8; N.div_ceil(8)],
|
||||
pub struct FixedBitSet<const N: usize> {
|
||||
data: [u8; N],
|
||||
}
|
||||
|
||||
impl<const N: usize> FixedBitSet<N>
|
||||
where
|
||||
[u8; N.div_ceil(8)]: Sized,
|
||||
{
|
||||
impl<const N: usize> FixedBitSet<N> {
|
||||
pub fn new() -> Self {
|
||||
FixedBitSet {
|
||||
data: [0; N.div_ceil(8)],
|
||||
}
|
||||
FixedBitSet { data: [0; N] }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -159,24 +157,18 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<const N: usize> AzaleaRead for FixedBitSet<N>
|
||||
where
|
||||
[u8; N.div_ceil(8)]: Sized,
|
||||
{
|
||||
impl<const N: usize> AzaleaRead for FixedBitSet<N> {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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<const N: usize> AzaleaWrite for FixedBitSet<N>
|
||||
where
|
||||
[u8; N.div_ceil(8)]: Sized,
|
||||
{
|
||||
impl<const N: usize> AzaleaWrite for FixedBitSet<N> {
|
||||
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(())
|
||||
|
|
|
@ -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<String> {
|
||||
// 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<bool> {
|
||||
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)
|
||||
}
|
|
@ -97,7 +97,7 @@ impl Default for ModelCustomization {
|
|||
|
||||
impl AzaleaRead for ModelCustomization {
|
||||
fn azalea_read(buf: &mut std::io::Cursor<&[u8]>) -> Result<Self, azalea_buf::BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@ pub struct Properties {
|
|||
|
||||
impl AzaleaRead for Properties {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ impl<T: PartialEq> PartialEq for BrigadierNumber<T> {
|
|||
|
||||
impl<T: AzaleaRead> AzaleaRead for BrigadierNumber<T> {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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<T: AzaleaRead> AzaleaRead for BrigadierNumber<T> {
|
|||
}
|
||||
impl<T: AzaleaWrite> AzaleaWrite for BrigadierNumber<T> {
|
||||
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<Self, BufReadError> {
|
||||
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<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ pub struct PlayerAbilitiesFlags {
|
|||
|
||||
impl AzaleaRead for PlayerAbilitiesFlags {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -183,7 +183,7 @@ pub struct ActionEnumSet {
|
|||
|
||||
impl AzaleaRead for ActionEnumSet {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ pub struct RelativeMovements {
|
|||
impl AzaleaRead for RelativeMovements {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
// 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),
|
||||
|
@ -56,7 +56,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);
|
||||
|
|
|
@ -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<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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) }>,
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ pub struct ServerboundPlayerAbilities {
|
|||
|
||||
impl AzaleaRead for ServerboundPlayerAbilities {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ pub struct ServerboundPlayerInput {
|
|||
|
||||
impl AzaleaRead for ServerboundPlayerInput {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ pub struct Flags {
|
|||
|
||||
impl AzaleaRead for Flags {
|
||||
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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<CachedSection> {
|
||||
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);
|
||||
|
|
|
@ -1,3 +1,2 @@
|
|||
[toolchain]
|
||||
channel = "nightly-2024-11-11"
|
||||
# channel = "nightly"
|
||||
channel = "nightly"
|
||||
|
|
Loading…
Add table
Reference in a new issue