1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00

fix for hypixel limbo

This commit is contained in:
mat 2024-02-22 22:41:54 -06:00
parent 69f7eebcb3
commit 038807e607
23 changed files with 89 additions and 66 deletions

View file

@ -8,7 +8,7 @@ use quote::quote;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Write; use std::fmt::Write;
use syn::{ use syn::{
self, braced, braced,
ext::IdentExt, ext::IdentExt,
parenthesized, parenthesized,
parse::{Parse, ParseStream, Result}, parse::{Parse, ParseStream, Result},

View file

@ -3,7 +3,7 @@ mod write;
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::{self, parse_macro_input, DeriveInput}; use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(McBufReadable, attributes(var))] #[proc_macro_derive(McBufReadable, attributes(var))]
pub fn derive_mcbufreadable(input: TokenStream) -> TokenStream { pub fn derive_mcbufreadable(input: TokenStream) -> TokenStream {

View file

@ -1,5 +1,5 @@
use quote::{quote, ToTokens}; use quote::{quote, ToTokens};
use syn::{self, punctuated::Punctuated, token::Comma, Data, Field, FieldsNamed, Ident}; use syn::{punctuated::Punctuated, token::Comma, Data, Field, FieldsNamed, Ident};
fn read_named_fields( fn read_named_fields(
named: &Punctuated<Field, Comma>, named: &Punctuated<Field, Comma>,

View file

@ -1,6 +1,6 @@
use proc_macro2::Span; use proc_macro2::Span;
use quote::{quote, ToTokens}; use quote::{quote, ToTokens};
use syn::{self, punctuated::Punctuated, token::Comma, Data, Field, FieldsNamed, Ident}; use syn::{punctuated::Punctuated, token::Comma, Data, Field, FieldsNamed, Ident};
fn write_named_fields( fn write_named_fields(
named: &Punctuated<Field, Comma>, named: &Punctuated<Field, Comma>,

View file

@ -29,7 +29,6 @@ fn handle_in_configuration_state(
mut send_packet_events: EventWriter<SendConfigurationPacketEvent>, mut send_packet_events: EventWriter<SendConfigurationPacketEvent>,
) { ) {
for (entity, client_information) in query.iter() { for (entity, client_information) in query.iter() {
// quickly send the brand here
let mut brand_data = Vec::new(); let mut brand_data = Vec::new();
// they don't have to know :) // they don't have to know :)
"vanilla".write_into(&mut brand_data).unwrap(); "vanilla".write_into(&mut brand_data).unwrap();

View file

@ -5,7 +5,7 @@ use azalea_core::game_type::GameMode;
use azalea_entity::Dead; use azalea_entity::Dead;
use azalea_protocol::packets::game::clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket; use azalea_protocol::packets::game::clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket;
use azalea_world::{Instance, PartialInstance}; use azalea_world::{Instance, PartialInstance};
use bevy_ecs::{component::Component, entity::Entity, prelude::*, query::Added, system::Query}; use bevy_ecs::{component::Component, prelude::*};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use parking_lot::RwLock; use parking_lot::RwLock;
use thiserror::Error; use thiserror::Error;

View file

@ -8,7 +8,7 @@ use parse_macro::{DeclareMenus, Field};
use proc_macro::TokenStream; use proc_macro::TokenStream;
use proc_macro2::Span; use proc_macro2::Span;
use quote::quote; use quote::quote;
use syn::{self, parse_macro_input, Ident}; use syn::{parse_macro_input, Ident};
#[proc_macro] #[proc_macro]
pub fn declare_menus(input: TokenStream) -> TokenStream { pub fn declare_menus(input: TokenStream) -> TokenStream {

View file

@ -1,5 +1,5 @@
use syn::{ use syn::{
self, braced, braced,
parse::{Parse, ParseStream, Result}, parse::{Parse, ParseStream, Result},
Ident, LitInt, Token, Ident, LitInt, Token,
}; };

View file

@ -1,4 +1,4 @@
use std::{cmp::Ordering, convert::TryInto}; use std::cmp::Ordering;
use super::CubePointRange; use super::CubePointRange;
use azalea_core::math::{gcd, lcm, EPSILON}; use azalea_core::math::{gcd, lcm, EPSILON};

View file

@ -424,10 +424,9 @@ fn jump_boost_power() -> f64 {
mod tests { mod tests {
use super::*; use super::*;
use azalea_core::{position::ChunkPos, resource_location::ResourceLocation, tick::GameTick}; use azalea_core::{position::ChunkPos, resource_location::ResourceLocation};
use azalea_entity::{EntityBundle, EntityPlugin}; use azalea_entity::{EntityBundle, EntityPlugin};
use azalea_world::{Chunk, MinecraftEntityId, PartialInstance}; use azalea_world::{Chunk, MinecraftEntityId, PartialInstance};
use bevy_app::App;
use uuid::Uuid; use uuid::Uuid;
/// You need an app to spawn entities in the world and do updates. /// You need an app to spawn entities in the world and do updates.

View file

@ -1,7 +1,7 @@
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::{ use syn::{
self, braced, braced,
parse::{Parse, ParseStream, Result}, parse::{Parse, ParseStream, Result},
parse_macro_input, DeriveInput, Ident, LitInt, Token, parse_macro_input, DeriveInput, Ident, LitInt, Token,
}; };

View file

@ -40,7 +40,7 @@ static PROXY_FAVICON: Lazy<Option<String>> = Lazy::new(|| None);
static PROXY_VERSION: Lazy<Version> = Lazy::new(|| Version { static PROXY_VERSION: Lazy<Version> = Lazy::new(|| Version {
name: "1.19.3".to_string(), name: "1.19.3".to_string(),
protocol: PROTOCOL_VERSION as i32, protocol: PROTOCOL_VERSION,
}); });
const PROXY_PLAYERS: Players = Players { const PROXY_PLAYERS: Players = Players {

File diff suppressed because one or more lines are too long

View file

@ -119,8 +119,6 @@ pub struct AdvancementHolder {
mod tests { mod tests {
use super::*; use super::*;
use azalea_buf::{McBufReadable, McBufWritable}; use azalea_buf::{McBufReadable, McBufWritable};
use azalea_core::resource_location::ResourceLocation;
use std::io::Cursor;
#[test] #[test]
fn test() { fn test() {

View file

@ -17,6 +17,7 @@ use std::{
use thiserror::Error; use thiserror::Error;
use tokio::io::AsyncRead; use tokio::io::AsyncRead;
use tokio_util::codec::{BytesCodec, FramedRead}; use tokio_util::codec::{BytesCodec, FramedRead};
use tracing::trace;
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum ReadPacketError { pub enum ReadPacketError {
@ -348,15 +349,17 @@ where
} }
if log::log_enabled!(log::Level::Trace) { if log::log_enabled!(log::Level::Trace) {
const EXTRA_LARGE_LOGS: bool = false;
let buf_string: String = { let buf_string: String = {
if buf.len() > 500 { if !EXTRA_LARGE_LOGS && buf.len() > 500 {
let cut_off_buf = &buf[..500]; let cut_off_buf = &buf[..500];
format!("{cut_off_buf:?}...") format!("{cut_off_buf:?}...")
} else { } else {
format!("{buf:?}") format!("{buf:?}")
} }
}; };
tracing::trace!("Reading packet with bytes: {buf_string}"); trace!("Reading packet with bytes: {buf_string}");
}; };
Ok(Some(buf)) Ok(Some(buf))

View file

@ -1,7 +1,7 @@
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::{ use syn::{
self, braced, braced,
parse::{Parse, ParseStream, Result}, parse::{Parse, ParseStream, Result},
parse_macro_input, parse_macro_input,
punctuated::Punctuated, punctuated::Punctuated,

View file

@ -114,8 +114,7 @@ impl BitStorage {
} }
} }
// vanilla has this assert but it's not always true for some reason?? debug_assert!((1..=32).contains(&bits));
// assert!(bits >= 1 && bits <= 32);
let values_per_long = 64 / bits; let values_per_long = 64 / bits;
let magic_index = values_per_long - 1; let magic_index = values_per_long - 1;

View file

@ -450,9 +450,8 @@ impl McBufReadable for Section {
for i in 0..states.storage.size() { for i in 0..states.storage.size() {
if !BlockState::is_valid_state(states.storage.get(i) as u32) { if !BlockState::is_valid_state(states.storage.get(i) as u32) {
return Err(BufReadError::Custom(format!( return Err(BufReadError::Custom(format!(
"Invalid block state {} (index {}) found in section.", "Invalid block state {} (index {i}) found in section.",
states.storage.get(i), states.storage.get(i)
i
))); )));
} }
} }

View file

@ -1,5 +1,7 @@
use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable};
use azalea_core::math;
use std::io::{Cursor, Write}; use std::io::{Cursor, Write};
use tracing::warn;
use crate::BitStorage; use crate::BitStorage;
@ -41,17 +43,39 @@ impl PalettedContainer {
buf: &mut Cursor<&[u8]>, buf: &mut Cursor<&[u8]>,
container_type: &'static PalettedContainerKind, container_type: &'static PalettedContainerKind,
) -> Result<Self, BufReadError> { ) -> Result<Self, BufReadError> {
let bits_per_entry = u8::read_from(buf)?; let server_bits_per_entry = u8::read_from(buf)?;
let palette_type = PaletteKind::from_bits_and_type(bits_per_entry, container_type); let palette_type = PaletteKind::from_bits_and_type(server_bits_per_entry, container_type);
let palette = palette_type.read(buf)?; let palette = palette_type.read(buf)?;
let size = container_type.size(); let size = container_type.size();
let data = Vec::<u64>::read_from(buf)?; let data = Vec::<u64>::read_from(buf)?;
// if there's too much data that the bits per entry would be global, we have to
// figure out the bits per entry ourselves by checking the number of bits in the
// length of the data.
// this almost never matters, except on some custom servers like hypixel limbo
let calculated_bits_per_entry = math::ceil_log2(data.len() as u32) as u8;
let calculated_bits_per_entry_palette_kind =
PaletteKind::from_bits_and_type(calculated_bits_per_entry, container_type);
let bits_per_entry = if calculated_bits_per_entry_palette_kind == PaletteKind::Global {
server_bits_per_entry
} else {
calculated_bits_per_entry
};
debug_assert!( debug_assert!(
bits_per_entry != 0 || data.is_empty(), bits_per_entry != 0 || data.is_empty(),
"Bits per entry is 0 but data is not empty." "Bits per entry is 0 but data is not empty."
); );
let storage = BitStorage::new(bits_per_entry.into(), size, Some(data)).unwrap();
let storage = match BitStorage::new(bits_per_entry.into(), size, Some(data)) {
Ok(storage) => storage,
Err(e) => {
warn!("Failed to create bit storage: {:?}", e);
return Err(BufReadError::Custom(
"Failed to create bit storage".to_string(),
));
}
};
Ok(PalettedContainer { Ok(PalettedContainer {
bits_per_entry, bits_per_entry,

View file

@ -16,6 +16,7 @@ use criterion::{criterion_group, criterion_main, Bencher, Criterion};
use parking_lot::RwLock; use parking_lot::RwLock;
use rand::{rngs::StdRng, Rng, SeedableRng}; use rand::{rngs::StdRng, Rng, SeedableRng};
#[allow(dead_code)]
fn generate_bedrock_world( fn generate_bedrock_world(
partial_chunks: &mut PartialChunkStorage, partial_chunks: &mut PartialChunkStorage,
size: u32, size: u32,
@ -87,7 +88,7 @@ fn generate_mining_world(
} }
} }
let mut rng = StdRng::seed_from_u64(0); // let mut rng = StdRng::seed_from_u64(0);
for chunk_x in -size..size { for chunk_x in -size..size {
for chunk_z in -size..size { for chunk_z in -size..size {

View file

@ -4,7 +4,6 @@ pub mod movement;
use azalea::brigadier::prelude::*; use azalea::brigadier::prelude::*;
use azalea::chat::ChatPacket; use azalea::chat::ChatPacket;
use azalea::ecs::prelude::Entity;
use azalea::ecs::prelude::*; use azalea::ecs::prelude::*;
use azalea::entity::metadata::Player; use azalea::entity::metadata::Player;
use azalea::Client; use azalea::Client;

View file

@ -15,7 +15,7 @@ mod commands;
pub mod killaura; pub mod killaura;
use azalea::pathfinder::PathfinderDebugParticles; use azalea::pathfinder::PathfinderDebugParticles;
use azalea::{Account, ClientInformation}; use azalea::ClientInformation;
use azalea::brigadier::command_dispatcher::CommandDispatcher; use azalea::brigadier::command_dispatcher::CommandDispatcher;
use azalea::ecs::prelude::*; use azalea::ecs::prelude::*;
@ -136,7 +136,7 @@ async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Resu
let command = if chat.is_whisper() { let command = if chat.is_whisper() {
Some(content) Some(content)
} else { } else {
content.strip_prefix("!").map(|s| s.to_owned()) content.strip_prefix('!').map(|s| s.to_owned())
}; };
if let Some(command) = command { if let Some(command) = command {
match state.commands.execute( match state.commands.execute(
@ -163,7 +163,7 @@ async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Resu
azalea::Event::Tick => { azalea::Event::Tick => {
killaura::tick(bot.clone(), state.clone())?; killaura::tick(bot.clone(), state.clone())?;
let task = state.task.lock().clone(); let task = *state.task.lock();
match task { match task {
BotTask::None => {} BotTask::None => {}
} }

View file

@ -489,13 +489,9 @@ pub fn is_block_state_solid(block: BlockState) -> bool {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::sync::Arc;
use super::*; use super::*;
use azalea_block::BlockState;
use azalea_core::position::ChunkPos;
use azalea_world::{Chunk, ChunkStorage, PartialInstance}; use azalea_world::{Chunk, ChunkStorage, PartialInstance};
use parking_lot::RwLock;
#[test] #[test]
fn test_is_passable() { fn test_is_passable() {