1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00
This commit is contained in:
mat 2025-06-17 06:49:07 -12:00
parent 319d144995
commit ffbe7a3e42
39 changed files with 1684 additions and 957 deletions

View file

@ -10,6 +10,7 @@ is breaking anyways, semantic versioning is not followed.
### Added
- Update to Minecraft 1.21.6.
- `HitResult` now contains the entity that's being looked at.
### Changed
@ -20,7 +21,7 @@ is breaking anyways, semantic versioning is not followed.
### Fixed
## [0.13.0] - 2025-06-15
## [0.13.0+mc1.21.5] - 2025-06-15
### Added

62
Cargo.lock generated
View file

@ -209,7 +209,7 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "azalea"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"anyhow",
"azalea-auth",
@ -249,7 +249,7 @@ dependencies = [
[[package]]
name = "azalea-auth"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-crypto",
@ -269,7 +269,7 @@ dependencies = [
[[package]]
name = "azalea-block"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-block-macros",
"azalea-buf",
@ -278,7 +278,7 @@ dependencies = [
[[package]]
name = "azalea-block-macros"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"proc-macro2",
"quote",
@ -287,7 +287,7 @@ dependencies = [
[[package]]
name = "azalea-brigadier"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-chat",
@ -298,7 +298,7 @@ dependencies = [
[[package]]
name = "azalea-buf"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf-macros",
"byteorder",
@ -311,7 +311,7 @@ dependencies = [
[[package]]
name = "azalea-buf-macros"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"proc-macro2",
"quote",
@ -320,7 +320,7 @@ dependencies = [
[[package]]
name = "azalea-chat"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-language",
@ -333,7 +333,7 @@ dependencies = [
[[package]]
name = "azalea-client"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"anyhow",
"async-compat",
@ -370,7 +370,7 @@ dependencies = [
[[package]]
name = "azalea-core"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-chat",
@ -386,7 +386,7 @@ dependencies = [
[[package]]
name = "azalea-crypto"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"aes",
"azalea-buf",
@ -403,7 +403,7 @@ dependencies = [
[[package]]
name = "azalea-entity"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-block",
"azalea-buf",
@ -426,7 +426,7 @@ dependencies = [
[[package]]
name = "azalea-inventory"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-chat",
@ -441,7 +441,7 @@ dependencies = [
[[package]]
name = "azalea-inventory-macros"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"proc-macro2",
"quote",
@ -450,7 +450,7 @@ dependencies = [
[[package]]
name = "azalea-language"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"compact_str",
"serde",
@ -459,7 +459,7 @@ dependencies = [
[[package]]
name = "azalea-physics"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-block",
"azalea-core",
@ -477,7 +477,7 @@ dependencies = [
[[package]]
name = "azalea-protocol"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"anyhow",
"async-recursion",
@ -513,7 +513,7 @@ dependencies = [
[[package]]
name = "azalea-protocol-macros"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"proc-macro2",
"quote",
@ -522,7 +522,7 @@ dependencies = [
[[package]]
name = "azalea-registry"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-buf",
"azalea-registry-macros",
@ -532,7 +532,7 @@ dependencies = [
[[package]]
name = "azalea-registry-macros"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"quote",
"syn",
@ -540,7 +540,7 @@ dependencies = [
[[package]]
name = "azalea-world"
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
dependencies = [
"azalea-block",
"azalea-buf",
@ -1163,9 +1163,9 @@ checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "crypto-bigint"
version = "0.7.0-pre.4"
version = "0.7.0-pre.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edaae5fb9dac79a07260e0b2006799ff4f1d342ab243fd7d0892215113b27904"
checksum = "a06a5e703b883b3744ddac8b7c5eade2d800d6559ef99760566f8103e3ad39bf"
dependencies = [
"num-traits",
"rand_core 0.9.3",
@ -2045,9 +2045,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.173"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libloading"
@ -2617,9 +2617,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@ -2871,9 +2871,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.27"
version = "0.23.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321"
checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643"
dependencies = [
"once_cell",
"ring",
@ -3444,9 +3444,9 @@ dependencies = [
[[package]]
name = "tracing-attributes"
version = "0.1.29"
version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662"
checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",

View file

@ -22,7 +22,7 @@ resolver = "2"
# --- Workspace Settings ---
[workspace.package]
version = "0.13.0+mc1.21.5"
version = "0.13.0+mc1.21.6"
edition = "2024"
license = "MIT"
repository = "https://github.com/azalea-rs/azalea"

View file

@ -10,7 +10,7 @@ A collection of Rust crates for making Minecraft bots, clients, and tools.
<!-- The line below is automatically read and updated by the migrate script, so don't change it manually. -->
_Currently supported Minecraft version: `1.21.5`._
_Currently supported Minecraft version: `1.21.6`._
> [!WARNING]
> Azalea is still unfinished, though most crates are in a useable state.

View file

@ -2,7 +2,7 @@ use std::fmt::Debug;
use azalea_block_macros::make_block_states;
use crate::{BlockTrait, BlockBehavior, BlockState, BlockStates, Property};
use crate::{BlockBehavior, BlockState, BlockStates, BlockTrait, Property};
make_block_states! {
Properties => {
@ -1561,6 +1561,12 @@ make_block_states! {
_1,
_2,
},
"hydration" => DriedGhastHydration {
_0,
_1,
_2,
_3,
},
"pickles" => SeaPicklePickles {
_1,
_2,
@ -4214,6 +4220,11 @@ make_block_states! {
sniffer_egg => BlockBehavior::new().strength(0.5, 0.5), {
"hatch": SnifferEggHatch::_0,
},
dried_ghast => BlockBehavior::new().force_solid(true), {
"facing": FacingCardinal::North,
"hydration": DriedGhastHydration::_0,
"waterlogged": Waterlogged(false),
},
dead_tube_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0).force_solid(true), {},
dead_brain_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0).force_solid(true), {},
dead_bubble_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0).force_solid(true), {},

View file

@ -56,6 +56,8 @@ pub fn process_packet(ecs: &mut World, player: Entity, packet: &ClientboundConfi
select_known_packs,
custom_report_details,
server_links,
clear_dialog,
show_dialog,
]
);
}
@ -220,4 +222,11 @@ impl ConfigPacketHandler<'_> {
pub fn custom_report_details(&mut self, p: &ClientboundCustomReportDetails) {
debug!("Got custom report details packet {p:?}");
}
pub fn clear_dialog(&mut self, p: &ClientboundClearDialog) {
debug!("Got clear dialog packet {p:?}");
}
pub fn show_dialog(&mut self, p: &ClientboundShowDialog) {
debug!("Got show dialog packet {p:?}");
}
}

View file

@ -176,6 +176,9 @@ pub fn process_packet(ecs: &mut World, player: Entity, packet: &ClientboundGameP
recipe_book_remove,
recipe_book_settings,
test_instance_block_status,
waypoint,
clear_dialog,
show_dialog,
]
);
}
@ -1584,4 +1587,12 @@ impl GamePacketHandler<'_> {
pub fn recipe_book_remove(&mut self, _p: &ClientboundRecipeBookRemove) {}
pub fn recipe_book_settings(&mut self, _p: &ClientboundRecipeBookSettings) {}
pub fn test_instance_block_status(&mut self, _p: &ClientboundTestInstanceBlockStatus) {}
pub fn waypoint(&mut self, _p: &ClientboundWaypoint) {}
pub fn clear_dialog(&mut self, p: &ClientboundClearDialog) {
debug!("Got clear dialog packet {p:?}");
}
pub fn show_dialog(&mut self, p: &ClientboundShowDialog) {
debug!("Got show dialog packet {p:?}");
}
}

View file

@ -89,6 +89,7 @@ impl From<EntityKind> for EntityDimensions {
EntityKind::GlowSquid => EntityDimensions::new(0.8, 0.8),
EntityKind::Goat => EntityDimensions::new(0.9, 1.3),
EntityKind::Guardian => EntityDimensions::new(0.85, 0.85),
EntityKind::HappyGhast => EntityDimensions::new(4.0, 4.0),
EntityKind::Hoglin => EntityDimensions::new(1.39648, 1.4),
EntityKind::HopperMinecart => EntityDimensions::new(0.98, 0.7),
EntityKind::Horse => EntityDimensions::new(1.39648, 1.6),

View file

@ -4235,6 +4235,8 @@ impl Default for GiantMetadataBundle {
}
}
#[derive(Component, Deref, DerefMut, Clone)]
pub struct ItemFrameDirection(pub Direction);
#[derive(Component, Deref, DerefMut, Clone)]
pub struct ItemFrameItem(pub ItemStack);
#[derive(Component, Deref, DerefMut, Clone)]
@ -4247,7 +4249,7 @@ impl GlowItemFrame {
d: EntityDataItem,
) -> Result<(), UpdateMetadataError> {
match d.index {
0..=9 => ItemFrame::apply_metadata(entity, d)?,
0..=10 => ItemFrame::apply_metadata(entity, d)?,
_ => {}
}
Ok(())
@ -4282,7 +4284,8 @@ impl Default for GlowItemFrameMetadataBundle {
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
item_frame_item: ItemFrameItem(ItemStack::Empty),
item_frame_direction: ItemFrameDirection(Default::default()),
item_frame_item: ItemFrameItem(Default::default()),
rotation: Rotation(0),
},
}
@ -4539,6 +4542,92 @@ impl Default for GuardianMetadataBundle {
}
}
#[derive(Component, Deref, DerefMut, Clone)]
pub struct IsLeashHolder(pub bool);
#[derive(Component, Deref, DerefMut, Clone)]
pub struct StaysStill(pub bool);
#[derive(Component)]
pub struct HappyGhast;
impl HappyGhast {
pub fn apply_metadata(
entity: &mut bevy_ecs::system::EntityCommands,
d: EntityDataItem,
) -> Result<(), UpdateMetadataError> {
match d.index {
0..=16 => AbstractAnimal::apply_metadata(entity, d)?,
17 => {
entity.insert(IsLeashHolder(d.value.into_boolean()?));
}
18 => {
entity.insert(StaysStill(d.value.into_boolean()?));
}
_ => {}
}
Ok(())
}
}
#[derive(Bundle)]
pub struct HappyGhastMetadataBundle {
_marker: HappyGhast,
parent: AbstractAnimalMetadataBundle,
is_leash_holder: IsLeashHolder,
stays_still: StaysStill,
}
impl Default for HappyGhastMetadataBundle {
fn default() -> Self {
Self {
_marker: HappyGhast,
parent: AbstractAnimalMetadataBundle {
_marker: AbstractAnimal,
parent: AbstractAgeableMetadataBundle {
_marker: AbstractAgeable,
parent: AbstractCreatureMetadataBundle {
_marker: AbstractCreature,
parent: AbstractInsentientMetadataBundle {
_marker: AbstractInsentient,
parent: AbstractLivingMetadataBundle {
_marker: AbstractLiving,
parent: AbstractEntityMetadataBundle {
_marker: AbstractEntity,
on_fire: OnFire(false),
shift_key_down: ShiftKeyDown(false),
sprinting: Sprinting(false),
swimming: Swimming(false),
currently_glowing: CurrentlyGlowing(false),
invisible: Invisible(false),
fall_flying: FallFlying(false),
air_supply: AirSupply(Default::default()),
custom_name: CustomName(Default::default()),
custom_name_visible: CustomNameVisible(Default::default()),
silent: Silent(Default::default()),
no_gravity: NoGravity(Default::default()),
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
auto_spin_attack: AutoSpinAttack(false),
abstract_living_using_item: AbstractLivingUsingItem(false),
health: Health(1.0),
effect_particles: EffectParticles(Default::default()),
effect_ambience: EffectAmbience(false),
arrow_count: ArrowCount(0),
stinger_count: StingerCount(0),
sleeping_pos: SleepingPos(None),
},
no_ai: NoAi(false),
left_handed: LeftHanded(false),
aggressive: Aggressive(false),
},
},
abstract_ageable_baby: AbstractAgeableBaby(false),
},
},
is_leash_holder: IsLeashHolder(false),
stays_still: StaysStill(false),
}
}
}
#[derive(Component, Deref, DerefMut, Clone)]
pub struct HoglinImmuneToZombification(pub bool);
#[derive(Component)]
@ -5096,7 +5185,7 @@ impl Default for ItemMetadataBundle {
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
item_item: ItemItem(ItemStack::Empty),
item_item: ItemItem(Default::default()),
}
}
}
@ -5191,7 +5280,7 @@ impl Default for ItemDisplayMetadataBundle {
abstract_display_height: AbstractDisplayHeight(0.0),
glow_color_override: GlowColorOverride(-1),
},
item_display_item_stack: ItemDisplayItemStack(ItemStack::Empty),
item_display_item_stack: ItemDisplayItemStack(Default::default()),
item_display_item_display: ItemDisplayItemDisplay(Default::default()),
}
}
@ -5207,9 +5296,12 @@ impl ItemFrame {
match d.index {
0..=7 => AbstractEntity::apply_metadata(entity, d)?,
8 => {
entity.insert(ItemFrameItem(d.value.into_item_stack()?));
entity.insert(ItemFrameDirection(d.value.into_direction()?));
}
9 => {
entity.insert(ItemFrameItem(d.value.into_item_stack()?));
}
10 => {
entity.insert(Rotation(d.value.into_int()?));
}
_ => {}
@ -5222,6 +5314,7 @@ impl ItemFrame {
pub struct ItemFrameMetadataBundle {
_marker: ItemFrame,
parent: AbstractEntityMetadataBundle,
item_frame_direction: ItemFrameDirection,
item_frame_item: ItemFrameItem,
rotation: Rotation,
}
@ -5246,7 +5339,8 @@ impl Default for ItemFrameMetadataBundle {
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
item_frame_item: ItemFrameItem(ItemStack::Empty),
item_frame_direction: ItemFrameDirection(Default::default()),
item_frame_item: ItemFrameItem(Default::default()),
rotation: Rotation(0),
}
}
@ -6338,11 +6432,13 @@ impl Default for OminousItemSpawnerMetadataBundle {
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
ominous_item_spawner_item: OminousItemSpawnerItem(ItemStack::Empty),
ominous_item_spawner_item: OminousItemSpawnerItem(Default::default()),
}
}
}
#[derive(Component, Deref, DerefMut, Clone)]
pub struct PaintingDirection(pub Direction);
#[derive(Component, Deref, DerefMut, Clone)]
pub struct PaintingVariant(pub azalea_registry::PaintingVariant);
#[derive(Component)]
@ -6355,6 +6451,9 @@ impl Painting {
match d.index {
0..=7 => AbstractEntity::apply_metadata(entity, d)?,
8 => {
entity.insert(PaintingDirection(d.value.into_direction()?));
}
9 => {
entity.insert(PaintingVariant(d.value.into_painting_variant()?));
}
_ => {}
@ -6367,6 +6466,7 @@ impl Painting {
pub struct PaintingMetadataBundle {
_marker: Painting,
parent: AbstractEntityMetadataBundle,
painting_direction: PaintingDirection,
painting_variant: PaintingVariant,
}
impl Default for PaintingMetadataBundle {
@ -6390,6 +6490,7 @@ impl Default for PaintingMetadataBundle {
pose: Pose::default(),
ticks_frozen: TicksFrozen(Default::default()),
},
painting_direction: PaintingDirection(Default::default()),
painting_variant: PaintingVariant(azalea_registry::PaintingVariant::new_raw(0)),
}
}
@ -12690,6 +12791,11 @@ pub fn apply_metadata(
Guardian::apply_metadata(entity, d)?;
}
}
azalea_registry::EntityKind::HappyGhast => {
for d in items {
HappyGhast::apply_metadata(entity, d)?;
}
}
azalea_registry::EntityKind::Hoglin => {
for d in items {
Hoglin::apply_metadata(entity, d)?;
@ -13325,6 +13431,9 @@ pub fn apply_default_metadata(
azalea_registry::EntityKind::Guardian => {
entity.insert(GuardianMetadataBundle::default());
}
azalea_registry::EntityKind::HappyGhast => {
entity.insert(HappyGhastMetadataBundle::default());
}
azalea_registry::EntityKind::Hoglin => {
entity.insert(HoglinMetadataBundle::default());
}

View file

@ -1,4 +1,4 @@
use azalea_block::{BlockTrait, BlockBehavior};
use azalea_block::{BlockBehavior, BlockTrait};
use azalea_core::tier::get_item_tier;
use azalea_registry as registry;

View file

@ -29,6 +29,8 @@
"advancements.adventure.crafters_crafting_crafters.title": "Crafters Crafting Crafters",
"advancements.adventure.fall_from_world_height.description": "Free fall from the top of the world (build limit) to the bottom of the world and survive",
"advancements.adventure.fall_from_world_height.title": "Caves & Cliffs",
"advancements.adventure.heart_transplanter.description": "Place a Creaking Heart with the correct alignment between two Pale Oak Log blocks",
"advancements.adventure.heart_transplanter.title": "Heart Transplanter",
"advancements.adventure.hero_of_the_village.description": "Successfully defend a village from a raid",
"advancements.adventure.hero_of_the_village.title": "Hero of the Village",
"advancements.adventure.honey_block_slide.description": "Jump into a Honey Block to break your fall",
@ -150,6 +152,8 @@
"advancements.husbandry.netherite_hoe.title": "Serious Dedication",
"advancements.husbandry.obtain_sniffer_egg.description": "Obtain a Sniffer Egg",
"advancements.husbandry.obtain_sniffer_egg.title": "Smells Interesting",
"advancements.husbandry.place_dried_ghast_in_water.description": "Place a Dried Ghast block into water",
"advancements.husbandry.place_dried_ghast_in_water.title": "Stay Hydrated!",
"advancements.husbandry.plant_any_sniffer_seed.description": "Plant any Sniffer seed",
"advancements.husbandry.plant_any_sniffer_seed.title": "Planting the Past",
"advancements.husbandry.plant_seed.description": "Plant a seed and watch it grow",
@ -344,6 +348,7 @@
"argument.float.big": "Float must not be more than %s, found %s",
"argument.float.low": "Float must not be less than %s, found %s",
"argument.gamemode.invalid": "Unknown game mode: %s",
"argument.hexcolor.invalid": "Invalid hex color code '%s'",
"argument.id.invalid": "Invalid ID",
"argument.id.unknown": "Unknown ID: %s",
"argument.integer.big": "Integer must not be more than %s, found %s",
@ -377,6 +382,7 @@
"argument.range.swapped": "Min cannot be bigger than max",
"argument.resource_or_id.failed_to_parse": "Failed to parse structure: %s",
"argument.resource_or_id.invalid": "Invalid id or tag",
"argument.resource_or_id.no_such_element": "Can't find element '%s' in registry '%s'",
"argument.resource_selector.not_found": "No matches for selector '%s' of type '%s'",
"argument.resource_tag.invalid_type": "Tag '%s' has wrong type '%s' (expected '%s')",
"argument.resource_tag.not_found": "Can't find tag '%s' of type '%s'",
@ -390,6 +396,7 @@
"argument.time.invalid_unit": "Invalid unit",
"argument.time.tick_count_too_low": "The tick count must not be less than %s, found %s",
"argument.uuid.invalid": "Invalid UUID",
"argument.waypoint.invalid": "Selected entity is not a waypoint",
"arguments.block.tag.unknown": "Unknown block tag '%s'",
"arguments.function.tag.unknown": "Unknown function tag '%s'",
"arguments.function.unknown": "Unknown function %s",
@ -428,6 +435,7 @@
"attribute.name.block_break_speed": "Block Break Speed",
"attribute.name.block_interaction_range": "Block Interaction Range",
"attribute.name.burning_time": "Burning Time",
"attribute.name.camera_distance": "Camera Distance",
"attribute.name.entity_interaction_range": "Entity Interaction Range",
"attribute.name.explosion_knockback_resistance": "Explosion Knockback Resistance",
"attribute.name.fall_damage_multiplier": "Fall Damage Multiplier",
@ -485,6 +493,8 @@
"attribute.name.sweeping_damage_ratio": "Sweeping Damage Ratio",
"attribute.name.tempt_range": "Mob Tempt Range",
"attribute.name.water_movement_efficiency": "Water Movement Efficiency",
"attribute.name.waypoint_receive_range": "Waypoint Receive Range",
"attribute.name.waypoint_transmit_range": "Waypoint Transmit Range",
"attribute.name.zombie.spawn_reinforcements": "Zombie Reinforcements",
"biome.minecraft.badlands": "Badlands",
"biome.minecraft.bamboo_jungle": "Bamboo Jungle",
@ -1592,6 +1602,7 @@
"block.minecraft.dragon_egg": "Dragon Egg",
"block.minecraft.dragon_head": "Dragon Head",
"block.minecraft.dragon_wall_head": "Dragon Wall Head",
"block.minecraft.dried_ghast": "Dried Ghast",
"block.minecraft.dried_kelp_block": "Dried Kelp Block",
"block.minecraft.dripstone_block": "Dripstone Block",
"block.minecraft.dropper": "Dropper",
@ -2343,6 +2354,7 @@
"block.minecraft.zombie_head": "Zombie Head",
"block.minecraft.zombie_wall_head": "Zombie Wall Head",
"book.byAuthor": "by %1$s",
"book.edit.title": "Book Edit Screen",
"book.editTitle": "Enter Book Title:",
"book.finalizeButton": "Sign and Close",
"book.finalizeWarning": "Note! When you sign the book, it will no longer be editable.",
@ -2351,8 +2363,13 @@
"book.generation.2": "Copy of a copy",
"book.generation.3": "Tattered",
"book.invalid.tag": "* Invalid book tag *",
"book.page_button.next": "Next Page",
"book.page_button.previous": "Previous Page",
"book.pageIndicator": "Page %1$s of %2$s",
"book.sign.title": "Book Sign Screen",
"book.sign.titlebox": "Title",
"book.signButton": "Sign",
"book.view.title": "Book View Screen",
"build.tooHigh": "Height limit for building is %s",
"chat_screen.message": "Message to send: %s",
"chat_screen.title": "Chat screen",
@ -2535,6 +2552,12 @@
"commands.data.storage.get": "%s in storage %s after scale factor of %s is %s",
"commands.data.storage.modified": "Modified storage %s",
"commands.data.storage.query": "Storage %s has the following contents: %s",
"commands.datapack.create.already_exists": "Pack with name '%s' already exists",
"commands.datapack.create.invalid_full_name": "Invalid new pack name '%s'",
"commands.datapack.create.invalid_name": "Invalid characters in new pack name '%s'",
"commands.datapack.create.io_failure": "Can't create pack with name '%s', check logs",
"commands.datapack.create.metadata_encode_failure": "Failed to encode metadata for pack with name '%s': %s",
"commands.datapack.create.success": "Created new empty pack with name '%s'",
"commands.datapack.disable.failed": "Pack '%s' is not enabled!",
"commands.datapack.disable.failed.feature": "Pack '%s' cannot be disabled, since it is part of an enabled flag!",
"commands.datapack.enable.failed": "Pack '%s' is already enabled!",
@ -2558,6 +2581,10 @@
"commands.defaultgamemode.success": "The default game mode is now %s",
"commands.deop.failed": "Nothing changed. The player is not an operator",
"commands.deop.success": "Made %s no longer a server operator",
"commands.dialog.clear.multiple": "Cleared dialog for %s players",
"commands.dialog.clear.single": "Cleared dialog for %s",
"commands.dialog.show.multiple": "Displayed dialog to %s players",
"commands.dialog.show.single": "Displayed dialog to %s",
"commands.difficulty.failure": "The difficulty did not change; it is already set to %s",
"commands.difficulty.query": "The difficulty is %s",
"commands.difficulty.success": "The difficulty has been set to %s",
@ -2925,6 +2952,22 @@
"commands.trigger.failed.unprimed": "You cannot trigger this objective yet",
"commands.trigger.set.success": "Triggered %s (set value to %s)",
"commands.trigger.simple.success": "Triggered %s",
"commands.version.build_time": "build_time = %s",
"commands.version.data": "data = %s",
"commands.version.header": "Server version info:",
"commands.version.id": "id = %s",
"commands.version.name": "name = %s",
"commands.version.pack.data": "pack_data = %s",
"commands.version.pack.resource": "pack_resource = %s",
"commands.version.protocol": "protocol = %s (%s)",
"commands.version.series": "series = %s",
"commands.version.stable.no": "stable = no",
"commands.version.stable.yes": "stable = yes",
"commands.waypoint.list.empty": "No waypoints in %s",
"commands.waypoint.list.success": "%s waypoint(s) in %s: %s",
"commands.waypoint.modify.color": "Waypoint color is now %s",
"commands.waypoint.modify.color.reset": "Reset waypoint color",
"commands.waypoint.modify.style": "Waypoint style changed",
"commands.weather.set.clear": "Set the weather to clear",
"commands.weather.set.rain": "Set the weather to rain",
"commands.weather.set.thunder": "Set the weather to rain & thunder",
@ -3043,6 +3086,8 @@
"credits_and_attribution.screen.title": "Credits and Attribution",
"dataPack.bundle.description": "Enables experimental Bundle item",
"dataPack.bundle.name": "Bundles",
"dataPack.locator_bar.description": "Show the direction of other players in multiplayer",
"dataPack.locator_bar.name": "Locator Bar",
"dataPack.minecart_improvements.description": "Improved movement for Minecarts",
"dataPack.minecart_improvements.name": "Minecart Improvements",
"dataPack.redstone_experiments.description": "Experimental Redstone changes",
@ -3216,6 +3261,8 @@
"debug.show_hitboxes.help": "F3 + B = Show hitboxes",
"debug.show_hitboxes.off": "Hitboxes: hidden",
"debug.show_hitboxes.on": "Hitboxes: shown",
"debug.version.header": "Client version info:",
"debug.version.help": "F3 + V = Client version info",
"demo.day.1": "This demo will last five game days. Do your best!",
"demo.day.2": "Day Two",
"demo.day.3": "Day Three",
@ -3418,6 +3465,7 @@
"entity.minecraft.glow_squid": "Glow Squid",
"entity.minecraft.goat": "Goat",
"entity.minecraft.guardian": "Guardian",
"entity.minecraft.happy_ghast": "Happy Ghast",
"entity.minecraft.hoglin": "Hoglin",
"entity.minecraft.hopper_minecart": "Minecart with Hopper",
"entity.minecraft.horse": "Horse",
@ -3649,6 +3697,8 @@
"gamerule.keepInventory": "Keep inventory after death",
"gamerule.lavaSourceConversion": "Lava converts to source",
"gamerule.lavaSourceConversion.description": "When flowing lava is surrounded on two sides by lava sources it converts into a source.",
"gamerule.locatorBar": "Enable player Locator Bar",
"gamerule.locatorBar.description": "When enabled, a bar is shown on the screen to indicate the direction of players.",
"gamerule.logAdminCommands": "Broadcast admin commands",
"gamerule.maxCommandChainLength": "Command chain size limit",
"gamerule.maxCommandChainLength.description": "Applies to command block chains and functions.",
@ -3836,6 +3886,7 @@
"gui.done": "Done",
"gui.down": "Down",
"gui.entity_tooltip.type": "Type: %s",
"gui.experience.level": "%s",
"gui.fileDropFailure.detail": "Rejected %s files",
"gui.fileDropFailure.title": "Failed to add files",
"gui.hours": "%s hour(s)",
@ -3897,6 +3948,8 @@
"gui.toTitle": "Back to Title Screen",
"gui.toWorld": "Back to World List",
"gui.up": "Up",
"gui.waitingForResponse.button.inactive": "Back (%ss)",
"gui.waitingForResponse.title": "Waiting for Server",
"gui.yes": "Yes",
"hanging_sign.edit": "Edit Hanging Sign Message",
"instrument.minecraft.admire_goat_horn": "Admire",
@ -3949,6 +4002,7 @@
"item.minecraft.birch_chest_boat": "Birch Boat with Chest",
"item.minecraft.black_bundle": "Black Bundle",
"item.minecraft.black_dye": "Black Dye",
"item.minecraft.black_harness": "Black Harness",
"item.minecraft.blade_pottery_shard": "Blade Pottery Shard",
"item.minecraft.blade_pottery_sherd": "Blade Pottery Sherd",
"item.minecraft.blaze_powder": "Blaze Powder",
@ -3957,6 +4011,7 @@
"item.minecraft.blue_bundle": "Blue Bundle",
"item.minecraft.blue_dye": "Blue Dye",
"item.minecraft.blue_egg": "Blue Egg",
"item.minecraft.blue_harness": "Blue Harness",
"item.minecraft.bogged_spawn_egg": "Bogged Spawn Egg",
"item.minecraft.bolt_armor_trim_smithing_template": "Smithing Template",
"item.minecraft.bolt_armor_trim_smithing_template.new": "Bolt Armor Trim",
@ -3976,6 +4031,7 @@
"item.minecraft.brown_bundle": "Brown Bundle",
"item.minecraft.brown_dye": "Brown Dye",
"item.minecraft.brown_egg": "Brown Egg",
"item.minecraft.brown_harness": "Brown Harness",
"item.minecraft.brush": "Brush",
"item.minecraft.bucket": "Bucket",
"item.minecraft.bundle": "Bundle",
@ -4034,6 +4090,7 @@
"item.minecraft.crossbow.projectile.single": "Projectile: %s",
"item.minecraft.cyan_bundle": "Cyan Bundle",
"item.minecraft.cyan_dye": "Cyan Dye",
"item.minecraft.cyan_harness": "Cyan Harness",
"item.minecraft.danger_pottery_shard": "Danger Pottery Shard",
"item.minecraft.danger_pottery_sherd": "Danger Pottery Sherd",
"item.minecraft.dark_oak_boat": "Dark Oak Boat",
@ -4165,14 +4222,18 @@
"item.minecraft.golden_sword": "Golden Sword",
"item.minecraft.gray_bundle": "Gray Bundle",
"item.minecraft.gray_dye": "Gray Dye",
"item.minecraft.gray_harness": "Gray Harness",
"item.minecraft.green_bundle": "Green Bundle",
"item.minecraft.green_dye": "Green Dye",
"item.minecraft.green_harness": "Green Harness",
"item.minecraft.guardian_spawn_egg": "Guardian Spawn Egg",
"item.minecraft.gunpowder": "Gunpowder",
"item.minecraft.guster_banner_pattern": "Banner Pattern",
"item.minecraft.guster_banner_pattern.desc": "Guster",
"item.minecraft.guster_banner_pattern.new": "Guster Banner Pattern",
"item.minecraft.guster_pottery_sherd": "Guster Pottery Sherd",
"item.minecraft.happy_ghast_spawn_egg": "Happy Ghast Spawn Egg",
"item.minecraft.harness": "Harness",
"item.minecraft.heart_of_the_sea": "Heart of the Sea",
"item.minecraft.heart_pottery_shard": "Heart Pottery Shard",
"item.minecraft.heart_pottery_sherd": "Heart Pottery Sherd",
@ -4217,10 +4278,13 @@
"item.minecraft.leather_leggings": "Leather Pants",
"item.minecraft.light_blue_bundle": "Light Blue Bundle",
"item.minecraft.light_blue_dye": "Light Blue Dye",
"item.minecraft.light_blue_harness": "Light Blue Harness",
"item.minecraft.light_gray_bundle": "Light Gray Bundle",
"item.minecraft.light_gray_dye": "Light Gray Dye",
"item.minecraft.light_gray_harness": "Light Gray Harness",
"item.minecraft.lime_bundle": "Lime Bundle",
"item.minecraft.lime_dye": "Lime Dye",
"item.minecraft.lime_harness": "Lime Harness",
"item.minecraft.lingering_potion": "Lingering Potion",
"item.minecraft.lingering_potion.effect.awkward": "Awkward Lingering Potion",
"item.minecraft.lingering_potion.effect.empty": "Lingering Uncraftable Potion",
@ -4253,6 +4317,7 @@
"item.minecraft.mace": "Mace",
"item.minecraft.magenta_bundle": "Magenta Bundle",
"item.minecraft.magenta_dye": "Magenta Dye",
"item.minecraft.magenta_harness": "Magenta Harness",
"item.minecraft.magma_cream": "Magma Cream",
"item.minecraft.magma_cube_spawn_egg": "Magma Cube Spawn Egg",
"item.minecraft.mangrove_boat": "Mangrove Boat",
@ -4306,6 +4371,8 @@
"item.minecraft.music_disc_stal.desc": "C418 - stal",
"item.minecraft.music_disc_strad": "Music Disc",
"item.minecraft.music_disc_strad.desc": "C418 - strad",
"item.minecraft.music_disc_tears": "Music Disc",
"item.minecraft.music_disc_tears.desc": "Amos Roddy - Tears",
"item.minecraft.music_disc_wait": "Music Disc",
"item.minecraft.music_disc_wait.desc": "C418 - wait",
"item.minecraft.music_disc_ward": "Music Disc",
@ -4336,6 +4403,7 @@
"item.minecraft.ominous_trial_key": "Ominous Trial Key",
"item.minecraft.orange_bundle": "Orange Bundle",
"item.minecraft.orange_dye": "Orange Dye",
"item.minecraft.orange_harness": "Orange Harness",
"item.minecraft.painting": "Painting",
"item.minecraft.pale_oak_boat": "Pale Oak Boat",
"item.minecraft.pale_oak_chest_boat": "Pale Oak Boat with Chest",
@ -4353,6 +4421,7 @@
"item.minecraft.pillager_spawn_egg": "Pillager Spawn Egg",
"item.minecraft.pink_bundle": "Pink Bundle",
"item.minecraft.pink_dye": "Pink Dye",
"item.minecraft.pink_harness": "Pink Harness",
"item.minecraft.pitcher_plant": "Pitcher Plant",
"item.minecraft.pitcher_pod": "Pitcher Pod",
"item.minecraft.plenty_pottery_shard": "Plenty Pottery Shard",
@ -4405,6 +4474,7 @@
"item.minecraft.pumpkin_seeds": "Pumpkin Seeds",
"item.minecraft.purple_bundle": "Purple Bundle",
"item.minecraft.purple_dye": "Purple Dye",
"item.minecraft.purple_harness": "Purple Harness",
"item.minecraft.quartz": "Nether Quartz",
"item.minecraft.rabbit": "Raw Rabbit",
"item.minecraft.rabbit_foot": "Rabbit's Foot",
@ -4420,6 +4490,7 @@
"item.minecraft.recovery_compass": "Recovery Compass",
"item.minecraft.red_bundle": "Red Bundle",
"item.minecraft.red_dye": "Red Dye",
"item.minecraft.red_harness": "Red Harness",
"item.minecraft.redstone": "Redstone Dust",
"item.minecraft.resin_brick": "Resin Brick",
"item.minecraft.resin_clump": "Resin Clump",
@ -4601,6 +4672,7 @@
"item.minecraft.wheat_seeds": "Wheat Seeds",
"item.minecraft.white_bundle": "White Bundle",
"item.minecraft.white_dye": "White Dye",
"item.minecraft.white_harness": "White Harness",
"item.minecraft.wild_armor_trim_smithing_template": "Smithing Template",
"item.minecraft.wild_armor_trim_smithing_template.new": "Wild Armor Trim",
"item.minecraft.wind_charge": "Wind Charge",
@ -4618,6 +4690,7 @@
"item.minecraft.written_book": "Written Book",
"item.minecraft.yellow_bundle": "Yellow Bundle",
"item.minecraft.yellow_dye": "Yellow Dye",
"item.minecraft.yellow_harness": "Yellow Harness",
"item.minecraft.zoglin_spawn_egg": "Zoglin Spawn Egg",
"item.minecraft.zombie_horse_spawn_egg": "Zombie Horse Spawn Egg",
"item.minecraft.zombie_spawn_egg": "Zombie Spawn Egg",
@ -4686,6 +4759,7 @@
"jukebox_song.minecraft.relic": "Aaron Cherof - Relic",
"jukebox_song.minecraft.stal": "C418 - stal",
"jukebox_song.minecraft.strad": "C418 - strad",
"jukebox_song.minecraft.tears": "Amos Roddy - Tears",
"jukebox_song.minecraft.wait": "C418 - wait",
"jukebox_song.minecraft.ward": "C418 - ward",
"key.advancements": "Advancements",
@ -4807,6 +4881,7 @@
"key.mouse.right": "Right Button",
"key.pickItem": "Pick Block",
"key.playerlist": "List Players",
"key.quickActions": "Quick Actions",
"key.right": "Strafe Right",
"key.saveToolbarActivator": "Save Hotbar Activator",
"key.screenshot": "Take Screenshot",
@ -4903,22 +4978,26 @@
"mco.configure.world.activityfeed.disabled": "Player feed temporarily disabled",
"mco.configure.world.backup": "World Backups",
"mco.configure.world.buttons.activity": "Player activity",
"mco.configure.world.buttons.close": "Close Realm",
"mco.configure.world.buttons.close": "Temporarily Close Realm",
"mco.configure.world.buttons.delete": "Delete",
"mco.configure.world.buttons.done": "Done",
"mco.configure.world.buttons.edit": "Settings",
"mco.configure.world.buttons.invite": "Invite Player",
"mco.configure.world.buttons.moreoptions": "More options",
"mco.configure.world.buttons.open": "Open Realm",
"mco.configure.world.buttons.newworld": "New World",
"mco.configure.world.buttons.open": "Reopen Realm",
"mco.configure.world.buttons.options": "World Options",
"mco.configure.world.buttons.players": "Players",
"mco.configure.world.buttons.region_preference": "Select Region...",
"mco.configure.world.buttons.resetworld": "Reset World",
"mco.configure.world.buttons.save": "Save",
"mco.configure.world.buttons.settings": "Settings",
"mco.configure.world.buttons.subscription": "Subscription",
"mco.configure.world.buttons.switchminigame": "Switch Minigame",
"mco.configure.world.close.question.line1": "Your Realm will become unavailable.",
"mco.configure.world.close.question.line1": "You can temporarily close your Realm, preventing play while you make adjustments. Open it back up when you're ready. \n\nThis does not cancel your Realms Subscription.",
"mco.configure.world.close.question.line2": "Are you sure you want to continue?",
"mco.configure.world.closing": "Closing the Realm...",
"mco.configure.world.close.question.title": "Need to make changes without disruption?",
"mco.configure.world.closing": "Temporarily closing the Realm...",
"mco.configure.world.commandBlocks": "Command Blocks",
"mco.configure.world.delete.button": "Delete Realm",
"mco.configure.world.delete.question.line1": "Your Realm will be permanently deleted",
@ -4938,6 +5017,7 @@
"mco.configure.world.invites.remove.tooltip": "Remove",
"mco.configure.world.leave.question.line1": "If you leave this Realm you won't see it unless you are invited again",
"mco.configure.world.leave.question.line2": "Are you sure you want to continue?",
"mco.configure.world.loading": "Loading Realm",
"mco.configure.world.location": "Location",
"mco.configure.world.minigame": "Current: %s",
"mco.configure.world.name": "Realm Name",
@ -4946,6 +5026,8 @@
"mco.configure.world.players.inviting": "Inviting player...",
"mco.configure.world.players.title": "Players",
"mco.configure.world.pvp": "PVP",
"mco.configure.world.region_preference": "Region Preference",
"mco.configure.world.region_preference.title": "Region Preference Selection",
"mco.configure.world.reset.question.line1": "Your world will be regenerated and your current world will be lost",
"mco.configure.world.reset.question.line2": "Are you sure you want to continue?",
"mco.configure.world.resourcepack.question": "You need a custom resource pack to play on this Realm\n\nDo you want to download it and play?",
@ -4955,6 +5037,7 @@
"mco.configure.world.restore.download.question.line2": "Do you want to continue?",
"mco.configure.world.restore.question.line1": "Your world will be restored to date '%s' (%s)",
"mco.configure.world.restore.question.line2": "Are you sure you want to continue?",
"mco.configure.world.settings.expired": "You cannot edit settings of an expired Realm",
"mco.configure.world.settings.title": "Settings",
"mco.configure.world.slot": "World %s",
"mco.configure.world.slot.empty": "Empty",
@ -4984,6 +5067,7 @@
"mco.configure.world.subscription.remaining.months": "%1$s month(s)",
"mco.configure.world.subscription.remaining.months.days": "%1$s month(s), %2$s day(s)",
"mco.configure.world.subscription.start": "Start Date",
"mco.configure.world.subscription.tab": "Subscription",
"mco.configure.world.subscription.timeleft": "Time Left",
"mco.configure.world.subscription.title": "Your Subscription",
"mco.configure.world.subscription.unknown": "Unknown",
@ -4996,6 +5080,7 @@
"mco.connect.authorizing": "Logging in...",
"mco.connect.connecting": "Connecting to the Realm...",
"mco.connect.failed": "Failed to connect to the Realm",
"mco.connect.region": "Server region: %s",
"mco.connect.success": "Done",
"mco.create.world": "Create",
"mco.create.world.error": "You must enter a name!",
@ -5034,6 +5119,7 @@
"mco.errorMessage.initialize.failed": "Failed to initialize Realm",
"mco.errorMessage.noDetails": "No error details provided",
"mco.errorMessage.realmsService": "An error occurred (%s):",
"mco.errorMessage.realmsService.configurationError": "An unexpected error occurred while editing world options",
"mco.errorMessage.realmsService.connectivity": "Could not connect to Realms: %s",
"mco.errorMessage.realmsService.realmsError": "Realms (%s):",
"mco.errorMessage.realmsService.unknownCompatibility": "Could not check compatible version, got response: %s",
@ -5070,6 +5156,7 @@
"mco.notification.visitUrl.buttonText.default": "Open Link",
"mco.notification.visitUrl.message.default": "Please visit the link below",
"mco.onlinePlayers": "Online Players",
"mco.play.button.realm.closed": "Realm is closed",
"mco.question": "Question",
"mco.reset.world.adventure": "Adventures",
"mco.reset.world.experience": "Experiences",
@ -5083,7 +5170,7 @@
"mco.reset.world.warning": "This will replace the current world of your Realm",
"mco.selectServer.buy": "Buy a Realm!",
"mco.selectServer.close": "Close",
"mco.selectServer.closed": "Closed Realm",
"mco.selectServer.closed": "Deactivated Realm",
"mco.selectServer.closeserver": "Close Realm",
"mco.selectServer.configure": "Configure",
"mco.selectServer.configureRealm": "Configure Realm",
@ -5175,6 +5262,14 @@
"mco.version": "Version: %s",
"mco.warning": "Warning!",
"mco.worldSlot.minigame": "Minigame",
"menu.custom_options": "Custom Options...",
"menu.custom_options.title": "Custom Options",
"menu.custom_options.tooltip": "Note: Custom options are provided by third-party servers and/or content.\nHandle with care!",
"menu.custom_screen_info.button_narration": "This is a custom screen. Learn more.",
"menu.custom_screen_info.contents": "The contents of this screen are controlled by third-party servers and maps that are not owned, operated, or supervised by Mojang Studios or Microsoft.\n\nHandle with care! Always be careful when following links and never give away your personal information, including login details.\n\nIf this screen prevents you from playing, you can also disconnect from the current server by using the button below.",
"menu.custom_screen_info.disconnect": "Custom screen rejected",
"menu.custom_screen_info.title": "Note about custom screens",
"menu.custom_screen_info.tooltip": "This is a custom screen. Click here to learn more.",
"menu.disconnect": "Disconnect",
"menu.feedback": "Feedback...",
"menu.feedback.title": "Feedback",
@ -5187,6 +5282,8 @@
"menu.playdemo": "Play Demo World",
"menu.playerReporting": "Player Reporting",
"menu.preparingSpawn": "Preparing spawn area: %s%%",
"menu.quick_actions": "Quick Actions...",
"menu.quick_actions.title": "Quick Actions",
"menu.quit": "Quit Game",
"menu.reportBugs": "Report Bugs",
"menu.resetdemo": "Reset Demo World",
@ -5213,6 +5310,9 @@
"mirror.none": "|",
"mount.onboard": "Press %1$s to Dismount",
"multiplayer.applyingPack": "Applying resource pack",
"multiplayer.confirm_command.parse_errors": "You are trying to execute an unrecognized or invalid command.\nAre you sure?\nCommand: %s",
"multiplayer.confirm_command.permissions_required": "You are trying to execute a command that requires elevated permissions.\nThis might negatively affect your game.\nAre you sure?\nCommand: %s",
"multiplayer.confirm_command.title": "Confirm Command Execution",
"multiplayer.disconnect.authservers_down": "Authentication servers are down. Please try again later, sorry!",
"multiplayer.disconnect.bad_chat_index": "Detected missed or reordered chat message from server",
"multiplayer.disconnect.banned": "You are banned from this server",
@ -5296,6 +5396,71 @@
"multiplayerWarning.check": "Do not show this screen again",
"multiplayerWarning.header": "Caution: Third-Party Online Play",
"multiplayerWarning.message": "Caution: Online play is offered by third-party servers that are not owned, operated, or supervised by Mojang Studios or Microsoft. During online play, you may be exposed to unmoderated chat messages or other types of user-generated content that may not be suitable for everyone.",
"music.game.a_familiar_room": "Aaron Cherof - A Familiar Room",
"music.game.an_ordinary_day": "Kumi Tanioka - An Ordinary Day",
"music.game.ancestry": "Lena Raine - Ancestry",
"music.game.below_and_above": "Amos Roddy - Below and Above",
"music.game.broken_clocks": "Amos Roddy - Broken Clocks",
"music.game.bromeliad": "Aaron Cherof - Bromeliad",
"music.game.clark": "C418 - Clark",
"music.game.comforting_memories": "Kumi Tanioka - Comforting Memories",
"music.game.creative.aria_math": "C418 - Aria Math",
"music.game.creative.biome_fest": "C418 - Biome Fest",
"music.game.creative.blind_spots": "C418 - Blind Spots",
"music.game.creative.dreiton": "C418 - Dreiton",
"music.game.creative.haunt_muskie": "C418 - Haunt Muskie",
"music.game.creative.taswell": "C418 - Taswell",
"music.game.crescent_dunes": "Aaron Cherof - Crescent Dunes",
"music.game.danny": "C418 - Danny",
"music.game.deeper": "Lena Raine - Deeper",
"music.game.dry_hands": "C418 - Dry Hands",
"music.game.echo_in_the_wind": "Aaron Cherof - Echo in the Wind",
"music.game.eld_unknown": "Lena Raine - Eld Unknown",
"music.game.end.alpha": "C418 - Alpha",
"music.game.end.boss": "C418 - Boss",
"music.game.end.the_end": "C418 - The End",
"music.game.endless": "Lena Raine - Endless",
"music.game.featherfall": "Aaron Cherof - Featherfall",
"music.game.fireflies": "Amos Roddy - Fireflies",
"music.game.floating_dream": "Kumi Tanioka - Floating Dream",
"music.game.haggstrom": "C418 - Haggstrom",
"music.game.infinite_amethyst": "Lena Raine - Infinite Amethyst",
"music.game.key": "C418 - Key",
"music.game.komorebi": "Kumi Tanioka - komorebi",
"music.game.left_to_bloom": "Lena Raine - Left to Bloom",
"music.game.lilypad": "Amos Roddy - Lilypad",
"music.game.living_mice": "C418 - Living Mice",
"music.game.mice_on_venus": "C418 - Mice on Venus",
"music.game.minecraft": "C418 - Minecraft",
"music.game.nether.ballad_of_the_cats": "C418 - Ballad of the Cats",
"music.game.nether.concrete_halls": "C418 - Concrete Halls",
"music.game.nether.crimson_forest.chrysopoeia": "Lena Raine - Chrysopoeia",
"music.game.nether.dead_voxel": "C418 - Dead Voxel",
"music.game.nether.nether_wastes.rubedo": "Lena Raine - Rubedo",
"music.game.nether.soulsand_valley.so_below": "Lena Raine - So Below",
"music.game.nether.warmth": "C418 - Warmth",
"music.game.one_more_day": "Lena Raine - One More Day",
"music.game.os_piano": "Amos Roddy - O's Piano",
"music.game.oxygene": "C418 - Oxyg\u00e8ne",
"music.game.pokopoko": "Kumi Tanioka - pokopoko",
"music.game.puzzlebox": "Aaron Cherof - Puzzlebox",
"music.game.stand_tall": "Lena Raine - Stand Tall",
"music.game.subwoofer_lullaby": "C418 - Subwoofer Lullaby",
"music.game.swamp.aerie": "Lena Raine - Aerie",
"music.game.swamp.firebugs": "Lena Raine - Firebugs",
"music.game.swamp.labyrinthine": "Lena Raine - Labyrinthine",
"music.game.sweden": "C418 - Sweden",
"music.game.watcher": "Aaron Cherof - Watcher",
"music.game.water.axolotl": "C418 - Axolotl",
"music.game.water.dragon_fish": "C418 - Dragon Fish",
"music.game.water.shuniji": "C418 - Shuniji",
"music.game.wending": "Lena Raine - Wending",
"music.game.wet_hands": "C418 - Wet Hands",
"music.game.yakusoku": "Kumi Tanioka - yakusoku",
"music.menu.beginning_2": "C418 - Beginning 2",
"music.menu.floating_trees": "C418 - Floating Trees",
"music.menu.moog_city_2": "C418 - Moog City 2",
"music.menu.mutation": "C418 - Mutation",
"narration.button": "Button: %s",
"narration.button.usage.focused": "Press Enter to activate",
"narration.button.usage.hovered": "Left click to activate",
@ -5306,6 +5471,7 @@
"narration.cycle_button.usage.focused": "Press Enter to switch to %s",
"narration.cycle_button.usage.hovered": "Left click to switch to %s",
"narration.edit_box": "Edit box: %s",
"narration.item": "Item: %s",
"narration.recipe": "Recipe for %s",
"narration.recipe.usage": "Left click to select",
"narration.recipe.usage.more": "Right click to show more recipes",
@ -5525,6 +5691,11 @@
"options.mouseWheelSensitivity": "Scroll Sensitivity",
"options.multiplayer.title": "Multiplayer Settings...",
"options.multiplier": "%sx",
"options.music_frequency": "Music Frequency",
"options.music_frequency.constant": "Constant",
"options.music_frequency.default": "Default",
"options.music_frequency.frequent": "Frequent",
"options.music_frequency.tooltip": "Changes how frequently music plays while in a game world.",
"options.narrator": "Narrator",
"options.narrator.all": "Narrates All",
"options.narrator.chat": "Narrates Chat",
@ -5561,6 +5732,7 @@
"options.realmsNotifications.tooltip": "Fetches Realms news and invites in the title screen and displays their respective icon on the Realms button.",
"options.reducedDebugInfo": "Reduced Debug Info",
"options.renderClouds": "Clouds",
"options.renderCloudsDistance": "Cloud Distance",
"options.renderDistance": "Render Distance",
"options.resourcepack": "Resource Packs...",
"options.rotateWithMinecart": "Rotate with Minecarts",
@ -5570,6 +5742,8 @@
"options.sensitivity": "Sensitivity",
"options.sensitivity.max": "HYPERSPEED!!!",
"options.sensitivity.min": "*yawn*",
"options.showNowPlayingToast": "Show Music Toast",
"options.showNowPlayingToast.tooltip": "Displays a toast whenever a song starts playing. The same toast is constantly displayed in the in-game pause menu while a song is playing.",
"options.showSubtitles": "Show Subtitles",
"options.simulationDistance": "Simulation Distance",
"options.skinCustomisation": "Skin Customization...",
@ -5747,6 +5921,31 @@
"quickplay.error.realm_connect": "Could not connect to Realm",
"quickplay.error.realm_permission": "Lacking permission to connect to this Realm",
"quickplay.error.title": "Failed to Quick Play",
"realms.configuration.region_preference.automatic_owner": "Automatic (Realm owner ping)",
"realms.configuration.region_preference.automatic_player": "Automatic (first to join session)",
"realms.configuration.region.australia_east": "New South Wales, Australia",
"realms.configuration.region.australia_southeast": "Victoria, Australia",
"realms.configuration.region.brazil_south": "Brazil",
"realms.configuration.region.central_india": "India",
"realms.configuration.region.central_us": "Iowa, USA",
"realms.configuration.region.east_asia": "Hong Kong",
"realms.configuration.region.east_us": "Virginia, USA",
"realms.configuration.region.east_us_2": "North Carolina, USA",
"realms.configuration.region.france_central": "France",
"realms.configuration.region.japan_east": "Eastern Japan",
"realms.configuration.region.japan_west": "Western Japan",
"realms.configuration.region.korea_central": "South Korea",
"realms.configuration.region.north_central_us": "Illinois, USA",
"realms.configuration.region.north_europe": "Ireland",
"realms.configuration.region.south_central_us": "Texas, USA",
"realms.configuration.region.southeast_asia": "Singapore",
"realms.configuration.region.sweden_central": "Sweden",
"realms.configuration.region.uae_north": "United Arab Emirates (UAE)",
"realms.configuration.region.uk_south": "Southern England",
"realms.configuration.region.west_central_us": "Utah, USA",
"realms.configuration.region.west_europe": "Netherlands",
"realms.configuration.region.west_us": "California, USA",
"realms.configuration.region.west_us_2": "Washington, USA",
"realms.missing.snapshot.error.text": "Realms is currently not supported in snapshots",
"recipe.notFound": "Unknown recipe: %s",
"recipe.toast.description": "Check your recipe book",
@ -5944,12 +6143,13 @@
"snbt.parser.undescore_not_allowed": "Underscore characters are not allowed at the start or end of a number",
"soundCategory.ambient": "Ambient/Environment",
"soundCategory.block": "Blocks",
"soundCategory.hostile": "Hostile Creatures",
"soundCategory.hostile": "Hostile Mobs",
"soundCategory.master": "Master Volume",
"soundCategory.music": "Music",
"soundCategory.neutral": "Friendly Creatures",
"soundCategory.neutral": "Friendly Mobs",
"soundCategory.player": "Players",
"soundCategory.record": "Jukebox/Note Blocks",
"soundCategory.ui": "UI",
"soundCategory.voice": "Voice/Speech",
"soundCategory.weather": "Weather",
"spectatorMenu.close": "Close Menu",
@ -5996,6 +6196,7 @@
"stat.minecraft.fill_cauldron": "Cauldrons Filled",
"stat.minecraft.fish_caught": "Fish Caught",
"stat.minecraft.fly_one_cm": "Distance Flown",
"stat.minecraft.happy_ghast_one_cm": "Distance by Happy Ghast",
"stat.minecraft.horse_one_cm": "Distance by Horse",
"stat.minecraft.inspect_dispenser": "Dispensers Searched",
"stat.minecraft.inspect_dropper": "Droppers Searched",
@ -6153,6 +6354,11 @@
"subtitles.block.dispenser.dispense": "Dispensed item",
"subtitles.block.dispenser.fail": "Dispenser failed",
"subtitles.block.door.toggle": "Door creaks",
"subtitles.block.dried_ghast.ambient": "Sounds of dryness",
"subtitles.block.dried_ghast.ambient_water": "Dried Ghast rehydrates",
"subtitles.block.dried_ghast.place_in_water": "Dried Ghast soaks",
"subtitles.block.dried_ghast.transition": "Dried Ghast feels better",
"subtitles.block.dry_grass.ambient": "Windy sounds",
"subtitles.block.enchantment_table.use": "Enchanting Table used",
"subtitles.block.end_portal_frame.fill": "Eye of Ender attaches",
"subtitles.block.end_portal.spawn": "End Portal opens",
@ -6215,6 +6421,8 @@
"subtitles.block.sniffer_egg.plop": "Sniffer plops",
"subtitles.block.sponge.absorb": "Sponge sucks",
"subtitles.block.sweet_berry_bush.pick_berries": "Berries pop",
"subtitles.block.trapdoor.close": "Trapdoor closes",
"subtitles.block.trapdoor.open": "Trapdoor opens",
"subtitles.block.trapdoor.toggle": "Trapdoor creaks",
"subtitles.block.trial_spawner.about_to_spawn_item": "Ominous item prepares",
"subtitles.block.trial_spawner.ambient": "Trial Spawner crackles",
@ -6453,6 +6661,10 @@
"subtitles.entity.ghast.death": "Ghast dies",
"subtitles.entity.ghast.hurt": "Ghast hurts",
"subtitles.entity.ghast.shoot": "Ghast shoots",
"subtitles.entity.ghastling.ambient": "Ghastling coos",
"subtitles.entity.ghastling.death": "Ghastling dies",
"subtitles.entity.ghastling.hurt": "Ghastling hurts",
"subtitles.entity.ghastling.spawn": "Ghastling appears",
"subtitles.entity.glow_item_frame.add_item": "Glow Item Frame fills",
"subtitles.entity.glow_item_frame.break": "Glow Item Frame broken",
"subtitles.entity.glow_item_frame.place": "Glow Item Frame placed",
@ -6479,6 +6691,13 @@
"subtitles.entity.guardian.death": "Guardian dies",
"subtitles.entity.guardian.flop": "Guardian flops",
"subtitles.entity.guardian.hurt": "Guardian hurts",
"subtitles.entity.happy_ghast.ambient": "Happy Ghast croons",
"subtitles.entity.happy_ghast.death": "Happy Ghast dies",
"subtitles.entity.happy_ghast.equip": "Harness equips",
"subtitles.entity.happy_ghast.harness_goggles_down": "Happy Ghast is ready",
"subtitles.entity.happy_ghast.harness_goggles_up": "Happy Ghast stops",
"subtitles.entity.happy_ghast.hurt": "Happy Ghast hurts",
"subtitles.entity.happy_ghast.unequip": "Harness unequips",
"subtitles.entity.hoglin.ambient": "Hoglin growls",
"subtitles.entity.hoglin.angry": "Hoglin growls angrily",
"subtitles.entity.hoglin.attack": "Hoglin attacks",
@ -6918,13 +7137,20 @@
"subtitles.item.hoe.till": "Hoe tills",
"subtitles.item.honey_bottle.drink": "Gulping",
"subtitles.item.honeycomb.wax_on": "Wax on",
"subtitles.item.horse_armor.unequip": "Horse Armor snips away",
"subtitles.item.ink_sac.use": "Ink Sac splotches",
"subtitles.item.lead.break": "Lead snaps",
"subtitles.item.lead.tied": "Lead tied",
"subtitles.item.lead.untied": "Lead untied",
"subtitles.item.llama_carpet.unequip": "Carpet snips away",
"subtitles.item.lodestone_compass.lock": "Lodestone Compass locks onto Lodestone",
"subtitles.item.mace.smash_air": "Mace smashes",
"subtitles.item.mace.smash_ground": "Mace smashes",
"subtitles.item.nether_wart.plant": "Crop planted",
"subtitles.item.ominous_bottle.dispose": "Bottle breaks",
"subtitles.item.saddle.unequip": "Saddle snips away",
"subtitles.item.shears.shear": "Shears click",
"subtitles.item.shears.snip": "Shears snip",
"subtitles.item.shield.block": "Shield blocks",
"subtitles.item.shovel.flatten": "Shovel flattens",
"subtitles.item.spyglass.stop_using": "Spyglass retracts",

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
use azalea_buf::AzBuf;
use azalea_protocol_macros::ClientboundConfigPacket;
#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
pub struct ClientboundClearDialog {}

View file

@ -0,0 +1,9 @@
use azalea_buf::AzBuf;
use azalea_protocol_macros::ClientboundConfigPacket;
use azalea_registry::Holder;
use simdnbt::owned::Nbt;
#[derive(Clone, Debug, AzBuf, ClientboundConfigPacket)]
pub struct ClientboundShowDialog {
pub dialog: Holder<azalea_registry::Dialog, Nbt>,
}

View file

@ -5,32 +5,35 @@ use azalea_protocol_macros::declare_state_packets;
declare_state_packets!(ConfigPacket,
Clientbound => [
cookie_request, // 0x00
custom_payload, // 0x01
disconnect, // 0x02
finish_configuration, // 0x03
keep_alive, // 0x04
ping, // 0x05
reset_chat, // 0x06
registry_data, // 0x07
resource_pack_pop, // 0x08
resource_pack_push, // 0x09
store_cookie, // 0x0A
transfer, // 0x0B
update_enabled_features, // 0x0C
update_tags, // 0x0D
select_known_packs, // 0x0E
custom_report_details, // 0x0F
server_links, // 0x10
cookie_request,
custom_payload,
disconnect,
finish_configuration,
keep_alive,
ping,
reset_chat,
registry_data,
resource_pack_pop,
resource_pack_push,
store_cookie,
transfer,
update_enabled_features,
update_tags,
select_known_packs,
custom_report_details,
server_links,
clear_dialog,
show_dialog,
],
Serverbound => [
client_information, // 0x00
cookie_response, // 0x01
custom_payload, // 0x02
finish_configuration, // 0x03
keep_alive, // 0x04
pong, // 0x05
resource_pack, // 0x06
select_known_packs, // 0x07
client_information,
cookie_response,
custom_payload,
finish_configuration,
keep_alive,
pong,
resource_pack,
select_known_packs,
custom_click_action,
]
);

View file

@ -0,0 +1,9 @@
use azalea_buf::AzBuf;
use azalea_core::resource_location::ResourceLocation;
use azalea_protocol_macros::ServerboundConfigPacket;
#[derive(Clone, Debug, AzBuf, ServerboundConfigPacket)]
pub struct ServerboundCustomClickAction {
pub id: ResourceLocation,
pub payload: Option<String>,
}

View file

@ -0,0 +1,5 @@
use azalea_buf::AzBuf;
use azalea_protocol_macros::ClientboundGamePacket;
#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
pub struct ClientboundClearDialog;

View file

@ -18,6 +18,7 @@ pub struct BrigadierNodeStub {
pub children: Vec<u32>,
pub redirect_node: Option<u32>,
pub node_type: NodeType,
pub is_restricted: bool,
}
#[derive(Debug, Clone, Eq)]
@ -91,8 +92,8 @@ pub enum BrigadierString {
GreedyPhrase = 2,
}
// see ArgumentTypeInfo
#[derive(Debug, Clone, AzBuf, PartialEq)]
// see ArgumentTypeInfos.java
#[derive(Debug, Clone, PartialEq, AzBuf)]
pub enum BrigadierParser {
Bool,
Float(BrigadierNumber<f32>),
@ -111,6 +112,7 @@ pub enum BrigadierParser {
ItemStack,
ItemPredicate,
Color,
HexColor,
FormattedText,
Style,
Message,
@ -148,6 +150,7 @@ pub enum BrigadierParser {
LootTable,
LootPredicate,
LootModifier,
Dialog,
Uuid,
}
@ -183,9 +186,9 @@ impl AzaleaWrite for EntityParser {
impl AzaleaRead for BrigadierNodeStub {
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
let flags = FixedBitSet::<8>::azalea_read(buf)?;
if flags.index(5) || flags.index(6) || flags.index(7) {
if flags.index(6) || flags.index(7) {
warn!(
"The flags from a Brigadier node are over 31. This is a bug, BrigadierParser probably needs updating.",
"The flags from a Brigadier node are over 63. This is a bug, BrigadierParser probably needs updating.",
);
}
@ -193,6 +196,7 @@ impl AzaleaRead for BrigadierNodeStub {
let is_executable = flags.index(2);
let has_redirect = flags.index(3);
let has_suggestions_type = flags.index(4);
let is_restricted = flags.index(5);
let children = Vec::<u32>::azalea_read_var(buf)?;
let redirect_node = if has_redirect {
@ -210,7 +214,7 @@ impl AzaleaRead for BrigadierNodeStub {
} else {
None
};
let node = BrigadierNodeStub {
Ok(BrigadierNodeStub {
is_executable,
children,
redirect_node,
@ -219,26 +223,29 @@ impl AzaleaRead for BrigadierNodeStub {
parser,
suggestions_type,
},
};
return Ok(node);
is_restricted,
})
}
// literal node
else if node_type == 1 {
let name = String::azalea_read(buf)?;
return Ok(BrigadierNodeStub {
Ok(BrigadierNodeStub {
is_executable,
children,
redirect_node,
node_type: NodeType::Literal { name },
});
}
is_restricted,
})
} else {
Ok(BrigadierNodeStub {
is_executable,
children,
redirect_node,
node_type: NodeType::Root,
is_restricted,
})
}
}
}
impl AzaleaWrite for BrigadierNodeStub {
@ -336,6 +343,7 @@ mod tests {
children: vec![1, 2],
redirect_node: None,
node_type: NodeType::Root,
is_restricted: false,
};
let mut buf = Vec::new();
data.azalea_write(&mut buf).unwrap();
@ -353,6 +361,7 @@ mod tests {
node_type: NodeType::Literal {
name: "String".to_string(),
},
is_restricted: false,
};
let mut buf = Vec::new();
data.azalea_write(&mut buf).unwrap();
@ -372,6 +381,7 @@ mod tests {
parser: BrigadierParser::Vec3,
suggestions_type: Some(ResourceLocation::new("minecraft:test_suggestion")),
},
is_restricted: false,
};
let mut buf = Vec::new();
data.azalea_write(&mut buf).unwrap();

View file

@ -0,0 +1,9 @@
use azalea_buf::AzBuf;
use azalea_protocol_macros::ClientboundGamePacket;
use azalea_registry::Holder;
use simdnbt::owned::Nbt;
#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
pub struct ClientboundShowDialog {
pub dialog: Holder<azalea_registry::Dialog, Nbt>,
}

View file

@ -0,0 +1,90 @@
use std::io::{self, Cursor, Write};
use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError};
use azalea_core::{color::RgbColor, position::Vec3i, resource_location::ResourceLocation};
use azalea_protocol_macros::ClientboundGamePacket;
use uuid::Uuid;
#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
pub struct ClientboundWaypoint {
pub operation: WaypointOperation,
pub waypoint: TrackedWaypoint,
}
#[derive(AzBuf, Copy, Clone, Debug)]
pub enum WaypointOperation {
Track,
Untrack,
Update,
}
#[derive(AzBuf, Clone, Debug)]
pub struct TrackedWaypoint {
pub identifier: WaypointIdentifier,
pub icon: WaypointIcon,
pub data: WaypointData,
}
#[derive(AzBuf, Clone, Debug)]
pub enum WaypointIdentifier {
String(String),
Uuid(Uuid),
}
#[derive(Clone, Debug)]
pub struct WaypointIcon {
pub style: ResourceLocation,
pub color: Option<RgbColor>,
}
impl AzaleaWrite for WaypointIcon {
fn azalea_write(&self, buf: &mut impl Write) -> Result<(), io::Error> {
self.style.azalea_write(buf)?;
let color = self.color.map(|c| CompactRgbColor {
r: c.red(),
g: c.green(),
b: c.blue(),
});
color.azalea_write(buf)?;
Ok(())
}
}
impl AzaleaRead for WaypointIcon {
fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
let style = ResourceLocation::azalea_read(buf)?;
let color = Option::<CompactRgbColor>::azalea_read(buf)?;
let color = color.map(|c| RgbColor::new(c.r, c.g, c.b));
Ok(Self { style, color })
}
}
// usually RgbColor is encoded as 4 bytes, except here where it's 3
#[derive(AzBuf)]
struct CompactRgbColor {
r: u8,
g: u8,
b: u8,
}
#[derive(AzBuf, Clone, Debug)]
pub struct WaypointIconFade {
pub near_dist: i32,
pub far_dist: i32,
pub near_alpha: u8,
pub far_alpha: u8,
}
#[derive(AzBuf, Clone, Debug)]
pub enum WaypointData {
Empty,
Vec3i(Vec3i),
Chunk {
#[var]
x: i32,
#[var]
z: i32,
},
Azimuth {
angle: f32,
},
}

View file

@ -5,202 +5,207 @@ use azalea_protocol_macros::declare_state_packets;
declare_state_packets!(GamePacket,
Clientbound => [
bundle_delimiter, // 0x00
add_entity, // 0x01
animate, // 0x02
award_stats, // 0x03
block_changed_ack, // 0x04
block_destruction, // 0x05
block_entity_data, // 0x06
block_event, // 0x07
block_update, // 0x08
boss_event, // 0x09
change_difficulty, // 0x0A
chunk_batch_finished, // 0x0B
chunk_batch_start, // 0x0C
chunks_biomes, // 0x0D
clear_titles, // 0x0E
command_suggestions, // 0x0F
commands, // 0x10
container_close, // 0x11
container_set_content, // 0x12
container_set_data, // 0x13
container_set_slot, // 0x14
cookie_request, // 0x15
cooldown, // 0x16
custom_chat_completions, // 0x17
custom_payload, // 0x18
damage_event, // 0x19
debug_sample, // 0x1A
delete_chat, // 0x1B
disconnect, // 0x1C
disguised_chat, // 0x1D
entity_event, // 0x1E
entity_position_sync, // 0x1F
explode, // 0x20
forget_level_chunk, // 0x21
game_event, // 0x22
horse_screen_open, // 0x23
hurt_animation, // 0x24
initialize_border, // 0x25
keep_alive, // 0x26
level_chunk_with_light, // 0x27
level_event, // 0x28
level_particles, // 0x29
light_update, // 0x2A
login, // 0x2B
map_item_data, // 0x2C
merchant_offers, // 0x2D
move_entity_pos, // 0x2E
move_entity_pos_rot, // 0x2F
move_minecart_along_track, // 0x30
move_entity_rot, // 0x31
move_vehicle, // 0x32
open_book, // 0x33
open_screen, // 0x34
open_sign_editor, // 0x35
ping, // 0x36
pong_response, // 0x37
place_ghost_recipe, // 0x38
player_abilities, // 0x39
player_chat, // 0x3A
player_combat_end, // 0x3B
player_combat_enter, // 0x3C
player_combat_kill, // 0x3D
player_info_remove, // 0x3E
player_info_update, // 0x3F
player_look_at, // 0x40
player_position, // 0x41
player_rotation, // 0x42
recipe_book_add, // 0x43
recipe_book_remove, // 0x44
recipe_book_settings, // 0x45
remove_entities, // 0x46
remove_mob_effect, // 0x47
reset_score, // 0x48
resource_pack_pop, // 0x49
resource_pack_push, // 0x4A
respawn, // 0x4B
rotate_head, // 0x4C
section_blocks_update, // 0x4D
select_advancements_tab, // 0x4E
server_data, // 0x4F
set_action_bar_text, // 0x50
set_border_center, // 0x51
set_border_lerp_size, // 0x52
set_border_size, // 0x53
set_border_warning_delay, // 0x54
set_border_warning_distance, // 0x55
set_camera, // 0x56
set_chunk_cache_center, // 0x57
set_chunk_cache_radius, // 0x58
set_cursor_item, // 0x59
set_default_spawn_position, // 0x5A
set_display_objective, // 0x5B
set_entity_data, // 0x5C
set_entity_link, // 0x5D
set_entity_motion, // 0x5E
set_equipment, // 0x5F
set_experience, // 0x60
set_health, // 0x61
set_held_slot, // 0x62
set_objective, // 0x63
set_passengers, // 0x64
set_player_inventory, // 0x65
set_player_team, // 0x66
set_score, // 0x67
set_simulation_distance, // 0x68
set_subtitle_text, // 0x69
set_time, // 0x6A
set_title_text, // 0x6B
set_titles_animation, // 0x6C
sound_entity, // 0x6D
sound, // 0x6E
start_configuration, // 0x6F
stop_sound, // 0x70
store_cookie, // 0x71
system_chat, // 0x72
tab_list, // 0x73
tag_query, // 0x74
take_item_entity, // 0x75
teleport_entity, // 0x76
test_instance_block_status, // 0x77
ticking_state, // 0x78
ticking_step, // 0x79
transfer, // 0x7A
update_advancements, // 0x7B
update_attributes, // 0x7C
update_mob_effect, // 0x7D
update_recipes, // 0x7E
update_tags, // 0x7F
projectile_power, // 0x80
custom_report_details, // 0x81
server_links, // 0x82
bundle_delimiter,
add_entity,
animate,
award_stats,
block_changed_ack,
block_destruction,
block_entity_data,
block_event,
block_update,
boss_event,
change_difficulty,
chunk_batch_finished,
chunk_batch_start,
chunks_biomes,
clear_titles,
command_suggestions,
commands,
container_close,
container_set_content,
container_set_data,
container_set_slot,
cookie_request,
cooldown,
custom_chat_completions,
custom_payload,
damage_event,
debug_sample,
delete_chat,
disconnect,
disguised_chat,
entity_event,
entity_position_sync,
explode,
forget_level_chunk,
game_event,
horse_screen_open,
hurt_animation,
initialize_border,
keep_alive,
level_chunk_with_light,
level_event,
level_particles,
light_update,
login,
map_item_data,
merchant_offers,
move_entity_pos,
move_entity_pos_rot,
move_minecart_along_track,
move_entity_rot,
move_vehicle,
open_book,
open_screen,
open_sign_editor,
ping,
pong_response,
place_ghost_recipe,
player_abilities,
player_chat,
player_combat_end,
player_combat_enter,
player_combat_kill,
player_info_remove,
player_info_update,
player_look_at,
player_position,
player_rotation,
recipe_book_add,
recipe_book_remove,
recipe_book_settings,
remove_entities,
remove_mob_effect,
reset_score,
resource_pack_pop,
resource_pack_push,
respawn,
rotate_head,
section_blocks_update,
select_advancements_tab,
server_data,
set_action_bar_text,
set_border_center,
set_border_lerp_size,
set_border_size,
set_border_warning_delay,
set_border_warning_distance,
set_camera,
set_chunk_cache_center,
set_chunk_cache_radius,
set_cursor_item,
set_default_spawn_position,
set_display_objective,
set_entity_data,
set_entity_link,
set_entity_motion,
set_equipment,
set_experience,
set_health,
set_held_slot,
set_objective,
set_passengers,
set_player_inventory,
set_player_team,
set_score,
set_simulation_distance,
set_subtitle_text,
set_time,
set_title_text,
set_titles_animation,
sound_entity,
sound,
start_configuration,
stop_sound,
store_cookie,
system_chat,
tab_list,
tag_query,
take_item_entity,
teleport_entity,
test_instance_block_status,
ticking_state,
ticking_step,
transfer,
update_advancements,
update_attributes,
update_mob_effect,
update_recipes,
update_tags,
projectile_power,
custom_report_details,
server_links,
waypoint,
clear_dialog,
show_dialog,
],
Serverbound => [
accept_teleportation, // 0x00
block_entity_tag_query, // 0x01
bundle_item_selected, // 0x02
change_difficulty, // 0x03
chat_ack, // 0x04
chat_command, // 0x05
chat_command_signed, // 0x06
chat, // 0x07
chat_session_update, // 0x08
chunk_batch_received, // 0x09
client_command, // 0x0A
client_tick_end, // 0x0B
client_information, // 0x0C
command_suggestion, // 0x0D
configuration_acknowledged, // 0x0E
container_button_click, // 0x0F
container_click, // 0x10
container_close, // 0x11
container_slot_state_changed, // 0x12
cookie_response, // 0x13
custom_payload, // 0x14
debug_sample_subscription, // 0x15
edit_book, // 0x16
entity_tag_query, // 0x17
interact, // 0x18
jigsaw_generate, // 0x19
keep_alive, // 0x1A
lock_difficulty, // 0x1B
move_player_pos, // 0x1C
move_player_pos_rot, // 0x1D
move_player_rot, // 0x1E
move_player_status_only, // 0x1F
move_vehicle, // 0x20
paddle_boat, // 0x21
pick_item_from_block, // 0x22
pick_item_from_entity, // 0x23
ping_request, // 0x24
place_recipe, // 0x25
player_abilities, // 0x26
player_action, // 0x27
player_command, // 0x28
player_input, // 0x29
player_loaded, // 0x2A
pong, // 0x2B
recipe_book_change_settings, // 0x2C
recipe_book_seen_recipe, // 0x2D
rename_item, // 0x2E
resource_pack, // 0x2F
seen_advancements, // 0x30
select_trade, // 0x31
set_beacon, // 0x32
set_carried_item, // 0x33
set_command_block, // 0x34
set_command_minecart, // 0x35
set_creative_mode_slot, // 0x36
set_jigsaw_block, // 0x37
set_structure_block, // 0x38
set_test_block, // 0x39
sign_update, // 0x3A
swing, // 0x3B
teleport_to_entity, // 0x3C
test_instance_block_action, // 0x3D
use_item_on, // 0x3E
use_item, // 0x3F
accept_teleportation,
block_entity_tag_query,
bundle_item_selected,
change_difficulty,
change_game_mode,
chat_ack,
chat_command,
chat_command_signed,
chat,
chat_session_update,
chunk_batch_received,
client_command,
client_tick_end,
client_information,
command_suggestion,
configuration_acknowledged,
container_button_click,
container_click,
container_close,
container_slot_state_changed,
cookie_response,
custom_payload,
debug_sample_subscription,
edit_book,
entity_tag_query,
interact,
jigsaw_generate,
keep_alive,
lock_difficulty,
move_player_pos,
move_player_pos_rot,
move_player_rot,
move_player_status_only,
move_vehicle,
paddle_boat,
pick_item_from_block,
pick_item_from_entity,
ping_request,
place_recipe,
player_abilities,
player_action,
player_command,
player_input,
player_loaded,
pong,
recipe_book_change_settings,
recipe_book_seen_recipe,
rename_item,
resource_pack,
seen_advancements,
select_trade,
set_beacon,
set_carried_item,
set_command_block,
set_command_minecart,
set_creative_mode_slot,
set_jigsaw_block,
set_structure_block,
set_test_block,
sign_update,
swing,
teleport_to_entity,
test_instance_block_action,
use_item_on,
use_item,
custom_click_action,
]
);

View file

@ -0,0 +1,8 @@
use azalea_buf::AzBuf;
use azalea_core::game_type::GameMode;
use azalea_protocol_macros::ServerboundGamePacket;
#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
pub struct ServerboundChangeGameMode {
pub mode: GameMode,
}

View file

@ -0,0 +1,9 @@
use azalea_buf::AzBuf;
use azalea_core::resource_location::ResourceLocation;
use azalea_protocol_macros::ServerboundGamePacket;
#[derive(Clone, Debug, AzBuf, ServerboundGamePacket)]
pub struct ServerboundCustomClickAction {
pub id: ResourceLocation,
pub payload: Option<String>,
}

View file

@ -13,13 +13,11 @@ pub struct ServerboundPlayerCommand {
#[derive(AzBuf, Clone, Copy, Debug)]
pub enum Action {
PressShiftKey = 0,
ReleaseShiftKey = 1,
StopSleeping = 2,
StartSprinting = 3,
StopSprinting = 4,
StartRidingJump = 5,
StopRidingJump = 6,
OpenInventory = 7,
StartFallFlying = 8,
StopSleeping,
StartSprinting,
StopSprinting,
StartRidingJump,
StopRidingJump,
OpenInventory,
StartFallFlying,
}

View file

@ -7,6 +7,6 @@ declare_state_packets!(HandshakePacket,
Clientbound => [
],
Serverbound => [
intention, // 0x00
intention,
]
);

View file

@ -5,18 +5,18 @@ use azalea_protocol_macros::declare_state_packets;
declare_state_packets!(LoginPacket,
Clientbound => [
login_disconnect, // 0x00
hello, // 0x01
login_finished, // 0x02
login_compression, // 0x03
custom_query, // 0x04
cookie_request, // 0x05
login_disconnect,
hello,
login_finished,
login_compression,
custom_query,
cookie_request,
],
Serverbound => [
hello, // 0x00
key, // 0x01
custom_query_answer, // 0x02
login_acknowledged, // 0x03
cookie_response, // 0x04
hello,
key,
custom_query_answer,
login_acknowledged,
cookie_response,
]
);

View file

@ -11,8 +11,8 @@ use azalea_buf::{AzaleaReadVar, AzaleaWrite, AzaleaWriteVar, BufReadError};
use crate::read::ReadPacketError;
pub const PROTOCOL_VERSION: i32 = 770;
pub const VERSION_NAME: &str = "1.21.5";
pub const PROTOCOL_VERSION: i32 = 771;
pub const VERSION_NAME: &str = "1.21.6";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ConnectionProtocol {

View file

@ -5,11 +5,11 @@ use azalea_protocol_macros::declare_state_packets;
declare_state_packets!(StatusPacket,
Clientbound => [
status_response, // 0x00
pong_response, // 0x01
status_response,
pong_response,
],
Serverbound => [
status_request, // 0x00
ping_request, // 0x01
status_request,
ping_request,
]
);

View file

@ -46,6 +46,9 @@ macro_rules! data_registry {
data_registry! {Enchantment, "enchantment"}
data_registry! {DimensionType, "dimension_type"}
data_registry! {DamageKind, "damage_kind"}
data_registry! {Dialog, "dialog"}
// entity variants
data_registry! {WolfSoundVariant, "wolf_sound_variant"}
data_registry! {CowVariant, "cow_variant"}
data_registry! {ChickenVariant, "chicken_variant"}

View file

@ -249,6 +249,7 @@ enum Attribute {
BlockBreakSpeed => "minecraft:block_break_speed",
BlockInteractionRange => "minecraft:block_interaction_range",
BurningTime => "minecraft:burning_time",
CameraDistance => "minecraft:camera_distance",
ExplosionKnockbackResistance => "minecraft:explosion_knockback_resistance",
EntityInteractionRange => "minecraft:entity_interaction_range",
FallDamageMultiplier => "minecraft:fall_damage_multiplier",
@ -273,6 +274,8 @@ enum Attribute {
SweepingDamageRatio => "minecraft:sweeping_damage_ratio",
TemptRange => "minecraft:tempt_range",
WaterMovementEfficiency => "minecraft:water_movement_efficiency",
WaypointTransmitRange => "minecraft:waypoint_transmit_range",
WaypointReceiveRange => "minecraft:waypoint_receive_range",
}
}
@ -998,6 +1001,7 @@ enum Block {
DriedKelpBlock => "minecraft:dried_kelp_block",
TurtleEgg => "minecraft:turtle_egg",
SnifferEgg => "minecraft:sniffer_egg",
DriedGhast => "minecraft:dried_ghast",
DeadTubeCoralBlock => "minecraft:dead_tube_coral_block",
DeadBrainCoralBlock => "minecraft:dead_brain_coral_block",
DeadBubbleCoralBlock => "minecraft:dead_bubble_coral_block",
@ -1499,6 +1503,7 @@ enum CommandArgumentKind {
ItemStack => "minecraft:item_stack",
ItemPredicate => "minecraft:item_predicate",
Color => "minecraft:color",
HexColor => "minecraft:hex_color",
Component => "minecraft:component",
Style => "minecraft:style",
Message => "minecraft:message",
@ -1536,6 +1541,7 @@ enum CommandArgumentKind {
LootTable => "minecraft:loot_table",
LootPredicate => "minecraft:loot_predicate",
LootModifier => "minecraft:loot_modifier",
Dialog => "minecraft:dialog",
Uuid => "minecraft:uuid",
}
}
@ -1559,6 +1565,7 @@ enum CustomStat {
MinecartOneCm => "minecraft:minecart_one_cm",
BoatOneCm => "minecraft:boat_one_cm",
PigOneCm => "minecraft:pig_one_cm",
HappyGhastOneCm => "minecraft:happy_ghast_one_cm",
HorseOneCm => "minecraft:horse_one_cm",
AviateOneCm => "minecraft:aviate_one_cm",
SwimOneCm => "minecraft:swim_one_cm",
@ -1679,6 +1686,7 @@ enum EntityKind {
Frog => "minecraft:frog",
FurnaceMinecart => "minecraft:furnace_minecart",
Ghast => "minecraft:ghast",
HappyGhast => "minecraft:happy_ghast",
Giant => "minecraft:giant",
GlowItemFrame => "minecraft:glow_item_frame",
GlowSquid => "minecraft:glow_squid",
@ -2513,6 +2521,7 @@ enum Item {
BlackConcretePowder => "minecraft:black_concrete_powder",
TurtleEgg => "minecraft:turtle_egg",
SnifferEgg => "minecraft:sniffer_egg",
DriedGhast => "minecraft:dried_ghast",
DeadTubeCoralBlock => "minecraft:dead_tube_coral_block",
DeadBrainCoralBlock => "minecraft:dead_brain_coral_block",
DeadBubbleCoralBlock => "minecraft:dead_bubble_coral_block",
@ -2695,6 +2704,22 @@ enum Item {
Rail => "minecraft:rail",
ActivatorRail => "minecraft:activator_rail",
Saddle => "minecraft:saddle",
WhiteHarness => "minecraft:white_harness",
OrangeHarness => "minecraft:orange_harness",
MagentaHarness => "minecraft:magenta_harness",
LightBlueHarness => "minecraft:light_blue_harness",
YellowHarness => "minecraft:yellow_harness",
LimeHarness => "minecraft:lime_harness",
PinkHarness => "minecraft:pink_harness",
GrayHarness => "minecraft:gray_harness",
LightGrayHarness => "minecraft:light_gray_harness",
CyanHarness => "minecraft:cyan_harness",
PurpleHarness => "minecraft:purple_harness",
BlueHarness => "minecraft:blue_harness",
BrownHarness => "minecraft:brown_harness",
GreenHarness => "minecraft:green_harness",
RedHarness => "minecraft:red_harness",
BlackHarness => "minecraft:black_harness",
Minecart => "minecraft:minecart",
ChestMinecart => "minecraft:chest_minecart",
FurnaceMinecart => "minecraft:furnace_minecart",
@ -2988,6 +3013,7 @@ enum Item {
FoxSpawnEgg => "minecraft:fox_spawn_egg",
FrogSpawnEgg => "minecraft:frog_spawn_egg",
GhastSpawnEgg => "minecraft:ghast_spawn_egg",
HappyGhastSpawnEgg => "minecraft:happy_ghast_spawn_egg",
GlowSquidSpawnEgg => "minecraft:glow_squid_spawn_egg",
GoatSpawnEgg => "minecraft:goat_spawn_egg",
GuardianSpawnEgg => "minecraft:guardian_spawn_egg",
@ -3144,6 +3170,7 @@ enum Item {
MusicDisc5 => "minecraft:music_disc_5",
MusicDiscPigstep => "minecraft:music_disc_pigstep",
MusicDiscPrecipice => "minecraft:music_disc_precipice",
MusicDiscTears => "minecraft:music_disc_tears",
DiscFragment5 => "minecraft:disc_fragment_5",
Trident => "minecraft:trident",
NautilusShell => "minecraft:nautilus_shell",
@ -3696,6 +3723,7 @@ enum PointOfInterestKind {
BeeNest => "minecraft:bee_nest",
NetherPortal => "minecraft:nether_portal",
Lodestone => "minecraft:lodestone",
TestInstance => "minecraft:test_instance",
LightningRod => "minecraft:lightning_rod",
}
}
@ -3842,12 +3870,14 @@ enum SensorKind {
PiglinBruteSpecificSensor => "minecraft:piglin_brute_specific_sensor",
HoglinSpecificSensor => "minecraft:hoglin_specific_sensor",
NearestAdult => "minecraft:nearest_adult",
NearestAdultAnyType => "minecraft:nearest_adult_any_type",
AxolotlAttackables => "minecraft:axolotl_attackables",
AxolotlTemptations => "minecraft:axolotl_temptations",
GoatTemptations => "minecraft:goat_temptations",
FrogTemptations => "minecraft:frog_temptations",
CamelTemptations => "minecraft:camel_temptations",
ArmadilloTemptations => "minecraft:armadillo_temptations",
HappyGhastTemptations => "minecraft:happy_ghast_temptations",
FrogAttackables => "minecraft:frog_attackables",
IsInWater => "minecraft:is_in_water",
WardenEntitySensor => "minecraft:warden_entity_sensor",
@ -4314,11 +4344,20 @@ enum SoundEvent {
EntityDonkeyEat => "minecraft:entity.donkey.eat",
EntityDonkeyHurt => "minecraft:entity.donkey.hurt",
EntityDonkeyJump => "minecraft:entity.donkey.jump",
BlockDriedGhastBreak => "minecraft:block.dried_ghast.break",
BlockDriedGhastStep => "minecraft:block.dried_ghast.step",
BlockDriedGhastFall => "minecraft:block.dried_ghast.fall",
BlockDriedGhastAmbient => "minecraft:block.dried_ghast.ambient",
BlockDriedGhastAmbientWater => "minecraft:block.dried_ghast.ambient_water",
BlockDriedGhastPlace => "minecraft:block.dried_ghast.place",
BlockDriedGhastPlaceInWater => "minecraft:block.dried_ghast.place_in_water",
BlockDriedGhastTransition => "minecraft:block.dried_ghast.transition",
BlockDripstoneBlockBreak => "minecraft:block.dripstone_block.break",
BlockDripstoneBlockStep => "minecraft:block.dripstone_block.step",
BlockDripstoneBlockPlace => "minecraft:block.dripstone_block.place",
BlockDripstoneBlockHit => "minecraft:block.dripstone_block.hit",
BlockDripstoneBlockFall => "minecraft:block.dripstone_block.fall",
BlockDryGrassAmbient => "minecraft:block.dry_grass.ambient",
BlockPointedDripstoneBreak => "minecraft:block.pointed_dripstone.break",
BlockPointedDripstoneStep => "minecraft:block.pointed_dripstone.step",
BlockPointedDripstonePlace => "minecraft:block.pointed_dripstone.place",
@ -4480,6 +4519,10 @@ enum SoundEvent {
EntityGhastScream => "minecraft:entity.ghast.scream",
EntityGhastShoot => "minecraft:entity.ghast.shoot",
EntityGhastWarn => "minecraft:entity.ghast.warn",
EntityGhastlingAmbient => "minecraft:entity.ghastling.ambient",
EntityGhastlingDeath => "minecraft:entity.ghastling.death",
EntityGhastlingHurt => "minecraft:entity.ghastling.hurt",
EntityGhastlingSpawn => "minecraft:entity.ghastling.spawn",
BlockGildedBlackstoneBreak => "minecraft:block.gilded_blackstone.break",
BlockGildedBlackstoneFall => "minecraft:block.gilded_blackstone.fall",
BlockGildedBlackstoneHit => "minecraft:block.gilded_blackstone.hit",
@ -4548,6 +4591,10 @@ enum SoundEvent {
BlockHangingSignFall => "minecraft:block.hanging_sign.fall",
BlockHangingSignHit => "minecraft:block.hanging_sign.hit",
BlockHangingSignPlace => "minecraft:block.hanging_sign.place",
EntityHappyGhastAmbient => "minecraft:entity.happy_ghast.ambient",
EntityHappyGhastDeath => "minecraft:entity.happy_ghast.death",
EntityHappyGhastHurt => "minecraft:entity.happy_ghast.hurt",
EntityHappyGhastRiding => "minecraft:entity.happy_ghast.riding",
BlockHeavyCoreBreak => "minecraft:block.heavy_core.break",
BlockHeavyCoreFall => "minecraft:block.heavy_core.fall",
BlockHeavyCoreHit => "minecraft:block.heavy_core.hit",
@ -4579,6 +4626,10 @@ enum SoundEvent {
BlockTrialSpawnerOpenShutter => "minecraft:block.trial_spawner.open_shutter",
BlockTrialSpawnerCloseShutter => "minecraft:block.trial_spawner.close_shutter",
BlockTrialSpawnerEjectItem => "minecraft:block.trial_spawner.eject_item",
EntityHappyGhastEquip => "minecraft:entity.happy_ghast.equip",
EntityHappyGhastUnequip => "minecraft:entity.happy_ghast.unequip",
EntityHappyGhastHarnessGogglesUp => "minecraft:entity.happy_ghast.harness_goggles_up",
EntityHappyGhastHarnessGogglesDown => "minecraft:entity.happy_ghast.harness_goggles_down",
ItemHoeTill => "minecraft:item.hoe.till",
EntityHoglinAmbient => "minecraft:entity.hoglin.ambient",
EntityHoglinAngry => "minecraft:entity.hoglin.angry",
@ -4607,6 +4658,7 @@ enum SoundEvent {
EntityHorseAmbient => "minecraft:entity.horse.ambient",
EntityHorseAngry => "minecraft:entity.horse.angry",
EntityHorseArmor => "minecraft:entity.horse.armor",
ItemHorseArmorUnequip => "minecraft:item.horse_armor.unequip",
EntityHorseBreathe => "minecraft:entity.horse.breathe",
EntityHorseDeath => "minecraft:entity.horse.death",
EntityHorseEat => "minecraft:entity.horse.eat",
@ -4678,8 +4730,9 @@ enum SoundEvent {
BlockLeafLitterPlace => "minecraft:block.leaf_litter.place",
BlockLeafLitterHit => "minecraft:block.leaf_litter.hit",
BlockLeafLitterFall => "minecraft:block.leaf_litter.fall",
EntityLeashKnotBreak => "minecraft:entity.leash_knot.break",
EntityLeashKnotPlace => "minecraft:entity.leash_knot.place",
ItemLeadUntied => "minecraft:item.lead.untied",
ItemLeadTied => "minecraft:item.lead.tied",
ItemLeadBreak => "minecraft:item.lead.break",
BlockLeverClick => "minecraft:block.lever.click",
EntityLightningBoltImpact => "minecraft:entity.lightning_bolt.impact",
EntityLightningBoltThunder => "minecraft:entity.lightning_bolt.thunder",
@ -4693,6 +4746,7 @@ enum SoundEvent {
EntityLlamaSpit => "minecraft:entity.llama.spit",
EntityLlamaStep => "minecraft:entity.llama.step",
EntityLlamaSwag => "minecraft:entity.llama.swag",
ItemLlamaCarpetUnequip => "minecraft:item.llama_carpet.unequip",
EntityMagmaCubeDeathSmall => "minecraft:entity.magma_cube.death_small",
BlockLodestoneBreak => "minecraft:block.lodestone.break",
BlockLodestoneStep => "minecraft:block.lodestone.step",
@ -4789,6 +4843,7 @@ enum SoundEvent {
MusicDiscCreator => "minecraft:music_disc.creator",
MusicDiscCreatorMusicBox => "minecraft:music_disc.creator_music_box",
MusicDiscPrecipice => "minecraft:music_disc.precipice",
MusicDiscTears => "minecraft:music_disc.tears",
MusicDragon => "minecraft:music.dragon",
MusicEnd => "minecraft:music.end",
MusicGame => "minecraft:music.game",
@ -5041,7 +5096,6 @@ enum SoundEvent {
BlockPowderSnowHit => "minecraft:block.powder_snow.hit",
BlockPowderSnowPlace => "minecraft:block.powder_snow.place",
BlockPowderSnowStep => "minecraft:block.powder_snow.step",
EntityPufferFishAmbient => "minecraft:entity.puffer_fish.ambient",
EntityPufferFishBlowOut => "minecraft:entity.puffer_fish.blow_out",
EntityPufferFishBlowUp => "minecraft:entity.puffer_fish.blow_up",
EntityPufferFishDeath => "minecraft:entity.puffer_fish.death",
@ -5093,7 +5147,6 @@ enum SoundEvent {
BlockSandPlace => "minecraft:block.sand.place",
BlockSandStep => "minecraft:block.sand.step",
BlockSandIdle => "minecraft:block.sand.idle",
BlockSandWind => "minecraft:block.sand.wind",
BlockScaffoldingBreak => "minecraft:block.scaffolding.break",
BlockScaffoldingFall => "minecraft:block.scaffolding.fall",
BlockScaffoldingHit => "minecraft:block.scaffolding.hit",
@ -5135,6 +5188,7 @@ enum SoundEvent {
EntitySheepHurt => "minecraft:entity.sheep.hurt",
EntitySheepShear => "minecraft:entity.sheep.shear",
EntitySheepStep => "minecraft:entity.sheep.step",
ItemShearsSnip => "minecraft:item.shears.snip",
ItemShieldBlock => "minecraft:item.shield.block",
ItemShieldBreak => "minecraft:item.shield.break",
BlockShroomlightBreak => "minecraft:block.shroomlight.break",
@ -5564,6 +5618,7 @@ enum SoundEvent {
EventMobEffectBadOmen => "minecraft:event.mob_effect.bad_omen",
EventMobEffectTrialOmen => "minecraft:event.mob_effect.trial_omen",
EventMobEffectRaidOmen => "minecraft:event.mob_effect.raid_omen",
ItemSaddleUnequip => "minecraft:item.saddle.unequip",
}
}
@ -6106,6 +6161,7 @@ enum BlockKind {
Door => "minecraft:door",
DoublePlant => "minecraft:double_plant",
DragonEgg => "minecraft:dragon_egg",
DriedGhast => "minecraft:dried_ghast",
DropExperience => "minecraft:drop_experience",
Dropper => "minecraft:dropper",
EnchantmentTable => "minecraft:enchantment_table",
@ -6244,7 +6300,6 @@ enum BlockKind {
TallGrass => "minecraft:tall_grass",
TallSeagrass => "minecraft:tall_seagrass",
Target => "minecraft:target",
Terracotta => "minecraft:terracotta",
Test => "minecraft:test",
TestInstance => "minecraft:test_instance",
TintedGlass => "minecraft:tinted_glass",
@ -6346,6 +6401,7 @@ enum TriggerKind {
ThrownItemPickedUpByEntity => "minecraft:thrown_item_picked_up_by_entity",
ThrownItemPickedUpByPlayer => "minecraft:thrown_item_picked_up_by_player",
PlayerInteractedWithEntity => "minecraft:player_interacted_with_entity",
PlayerShearedEquipment => "minecraft:player_sheared_equipment",
StartedRiding => "minecraft:started_riding",
LightningStrike => "minecraft:lightning_strike",
UsingItem => "minecraft:using_item",
@ -6762,3 +6818,43 @@ enum SpawnConditionKind {
Biome => "minecraft:biome",
}
}
registry! {
enum DialogBodyKind {
Item => "minecraft:item",
PlainMessage => "minecraft:plain_message",
}
}
registry! {
enum DialogKind {
Notice => "minecraft:notice",
ServerLinks => "minecraft:server_links",
DialogList => "minecraft:dialog_list",
MultiAction => "minecraft:multi_action",
Confirmation => "minecraft:confirmation",
}
}
registry! {
enum InputControlKind {
Boolean => "minecraft:boolean",
NumberRange => "minecraft:number_range",
SingleOption => "minecraft:single_option",
Text => "minecraft:text",
}
}
registry! {
enum DialogActionKind {
OpenUrl => "minecraft:open_url",
RunCommand => "minecraft:run_command",
SuggestCommand => "minecraft:suggest_command",
ShowDialog => "minecraft:show_dialog",
ChangePage => "minecraft:change_page",
CopyToClipboard => "minecraft:copy_to_clipboard",
Custom => "minecraft:custom",
DynamicRunCommand => "minecraft:dynamic/run_command",
DynamicCustom => "minecraft:dynamic/custom",
}
}

View file

@ -148,7 +148,6 @@ pub static AZALEA_GROWS_ON: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
Block::Terracotta,
Block::WhiteTerracotta,
Block::OrangeTerracotta,
@ -233,7 +232,6 @@ pub static BAMBOO_PLANTABLE_ON: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
Block::Dirt,
Block::GrassBlock,
Block::Podzol,
@ -432,7 +430,6 @@ pub static CAMEL_SAND_STEP_SOUND_BLOCKS: LazyLock<HashSet<Block>> = LazyLock::ne
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
Block::WhiteConcretePowder,
Block::OrangeConcretePowder,
Block::MagentaConcretePowder,
@ -451,14 +448,8 @@ pub static CAMEL_SAND_STEP_SOUND_BLOCKS: LazyLock<HashSet<Block>> = LazyLock::ne
Block::BlackConcretePowder,
])
});
pub static CAMELS_SPAWNABLE_ON: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
])
});
pub static CAMELS_SPAWNABLE_ON: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand, Block::SuspiciousSand]));
pub static CAMPFIRES: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::Campfire, Block::SoulCampfire]));
pub static CANDLE_CAKES: LazyLock<HashSet<Block>> = LazyLock::new(|| {
@ -848,7 +839,6 @@ pub static DRY_VEGETATION_MAY_PLACE_ON: LazyLock<HashSet<Block>> = LazyLock::new
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
Block::Terracotta,
Block::WhiteTerracotta,
Block::OrangeTerracotta,
@ -1185,6 +1175,16 @@ pub static GUARDED_BY_PIGLINS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::DeepslateGoldOre,
])
});
pub static HAPPY_GHAST_AVOIDS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::SweetBerryBush,
Block::Cactus,
Block::WitherRose,
Block::MagmaBlock,
Block::Fire,
Block::PointedDripstone,
])
});
pub static HOGLIN_REPELLENTS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::WarpedFungus,
@ -2768,7 +2768,6 @@ pub static OVERWORLD_CARVER_REPLACEABLES: LazyLock<HashSet<Block>> = LazyLock::n
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
Block::Terracotta,
Block::WhiteTerracotta,
Block::OrangeTerracotta,
@ -2902,29 +2901,6 @@ pub static PLANKS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::CherryPlanks,
])
});
pub static PLAYS_AMBIENT_DESERT_BLOCK_SOUNDS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::Sand,
Block::RedSand,
Block::Terracotta,
Block::WhiteTerracotta,
Block::OrangeTerracotta,
Block::MagentaTerracotta,
Block::LightBlueTerracotta,
Block::YellowTerracotta,
Block::LimeTerracotta,
Block::PinkTerracotta,
Block::GrayTerracotta,
Block::LightGrayTerracotta,
Block::CyanTerracotta,
Block::PurpleTerracotta,
Block::BlueTerracotta,
Block::BrownTerracotta,
Block::GreenTerracotta,
Block::RedTerracotta,
Block::BlackTerracotta,
])
});
pub static POLAR_BEARS_SPAWNABLE_ON_ALTERNATE: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::Ice]));
pub static PORTALS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
@ -3129,14 +3105,8 @@ pub static REPLACEABLE_BY_TREES: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::ClosedEyeblossom,
])
});
pub static SAND: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::Sand,
Block::RedSand,
Block::SuspiciousSand,
Block::SuspiciousSand,
])
});
pub static SAND: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand, Block::SuspiciousSand]));
pub static SAPLINGS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::OakSapling,
@ -3637,6 +3607,34 @@ pub static TRAPDOORS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
Block::CherryTrapdoor,
])
});
pub static TRIGGERS_AMBIENT_DESERT_DRY_VEGETATION_BLOCK_SOUNDS: LazyLock<HashSet<Block>> =
LazyLock::new(|| {
HashSet::from_iter(vec![
Block::Sand,
Block::RedSand,
Block::Terracotta,
Block::WhiteTerracotta,
Block::OrangeTerracotta,
Block::MagentaTerracotta,
Block::LightBlueTerracotta,
Block::YellowTerracotta,
Block::LimeTerracotta,
Block::PinkTerracotta,
Block::GrayTerracotta,
Block::LightGrayTerracotta,
Block::CyanTerracotta,
Block::PurpleTerracotta,
Block::BlueTerracotta,
Block::BrownTerracotta,
Block::GreenTerracotta,
Block::RedTerracotta,
Block::BlackTerracotta,
])
});
pub static TRIGGERS_AMBIENT_DESERT_SAND_BLOCK_SOUNDS: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand]));
pub static TRIGGERS_AMBIENT_DRIED_GHAST_BLOCK_SOUNDS: LazyLock<HashSet<Block>> =
LazyLock::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil]));
pub static UNDERWATER_BONEMEALS: LazyLock<HashSet<Block>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Block::Seagrass,

View file

@ -1079,6 +1079,49 @@ pub static HANGING_SIGNS: LazyLock<HashSet<Item>> = LazyLock::new(|| {
Item::BambooHangingSign,
])
});
pub static HAPPY_GHAST_FOOD: LazyLock<HashSet<Item>> =
LazyLock::new(|| HashSet::from_iter(vec![Item::Snowball]));
pub static HAPPY_GHAST_TEMPT_ITEMS: LazyLock<HashSet<Item>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Item::Snowball,
Item::WhiteHarness,
Item::OrangeHarness,
Item::MagentaHarness,
Item::LightBlueHarness,
Item::YellowHarness,
Item::LimeHarness,
Item::PinkHarness,
Item::GrayHarness,
Item::LightGrayHarness,
Item::CyanHarness,
Item::PurpleHarness,
Item::BlueHarness,
Item::BrownHarness,
Item::GreenHarness,
Item::RedHarness,
Item::BlackHarness,
])
});
pub static HARNESSES: LazyLock<HashSet<Item>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Item::WhiteHarness,
Item::OrangeHarness,
Item::MagentaHarness,
Item::LightBlueHarness,
Item::YellowHarness,
Item::LimeHarness,
Item::PinkHarness,
Item::GrayHarness,
Item::LightGrayHarness,
Item::CyanHarness,
Item::PurpleHarness,
Item::BlueHarness,
Item::BrownHarness,
Item::GreenHarness,
Item::RedHarness,
Item::BlackHarness,
])
});
pub static HEAD_ARMOR: LazyLock<HashSet<Item>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Item::LeatherHelmet,
@ -1108,6 +1151,7 @@ pub static HORSE_FOOD: LazyLock<HashSet<Item>> = LazyLock::new(|| {
Item::Sugar,
Item::HayBlock,
Item::Apple,
Item::Carrot,
Item::GoldenCarrot,
Item::GoldenApple,
Item::EnchantedGoldenApple,
@ -1463,14 +1507,8 @@ pub static REPAIRS_TURTLE_HELMET: LazyLock<HashSet<Item>> =
LazyLock::new(|| HashSet::from_iter(vec![Item::TurtleScute]));
pub static REPAIRS_WOLF_ARMOR: LazyLock<HashSet<Item>> =
LazyLock::new(|| HashSet::from_iter(vec![Item::ArmadilloScute]));
pub static SAND: LazyLock<HashSet<Item>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Item::Sand,
Item::RedSand,
Item::SuspiciousSand,
Item::SuspiciousSand,
])
});
pub static SAND: LazyLock<HashSet<Item>> =
LazyLock::new(|| HashSet::from_iter(vec![Item::Sand, Item::RedSand, Item::SuspiciousSand]));
pub static SAPLINGS: LazyLock<HashSet<Item>> = LazyLock::new(|| {
HashSet::from_iter(vec![
Item::OakSapling,

View file

@ -47,7 +47,7 @@ fn generate_bedrock_world(
azalea_registry::Block::Bedrock.into(),
chunks.min_y,
);
if rng.gen_bool(0.5) {
if rng.random_bool(0.5) {
chunk.set_block_state(
&ChunkBlockPos::new(x, 2, z),
azalea_registry::Block::Bedrock.into(),

View file

@ -2,7 +2,7 @@ use azalea::{
ecs::prelude::*,
entity::{Dead, LocalEntity, Position, metadata::AbstractMonster},
prelude::*,
world::{InstanceName, MinecraftEntityId},
world::InstanceName,
};
use crate::State;
@ -21,12 +21,12 @@ pub fn tick(bot: Client, state: State) -> anyhow::Result<()> {
{
let mut ecs = bot.ecs.lock();
let mut query = ecs
.query_filtered::<(&MinecraftEntityId, &Position, &InstanceName), (
.query_filtered::<(Entity, &Position, &InstanceName), (
With<AbstractMonster>,
Without<LocalEntity>,
Without<Dead>,
)>();
for (&entity_id, position, instance_name) in query.iter(&ecs) {
for (entity_id, position, instance_name) in query.iter(&ecs) {
if instance_name != &bot_instance_name {
continue;
}

View file

@ -1,4 +1,3 @@
use std::{
collections::HashSet,
sync::Arc,

View file

@ -1,4 +1,4 @@
from lib.utils import padded_hex, to_snake_case, to_camel_case, get_dir_location
from lib.utils import to_snake_case, to_camel_case, get_dir_location
from lib.code.utils import burger_type_to_rust_type, write_packet_file
from lib.mappings import Mappings
from typing import Optional
@ -75,14 +75,14 @@ def set_packets(packets_report):
code.append(f"declare_state_packets!({to_camel_case(state)}Packet,")
code.append(" Clientbound => [")
for packet_id, packet_name in enumerate(clientbound_packets):
code.append(f" {packet_name}, // {padded_hex(packet_id)}")
code.append(f" {packet_name},")
expected_packet_module_names.add(
get_packet_module_name(packet_name, "clientbound")
)
code.append(" ],")
code.append(" Serverbound => [")
for packet_id, packet_name in enumerate(serverbound_packets):
code.append(f" {packet_name}, // {padded_hex(packet_id)}")
code.append(f" {packet_name},")
expected_packet_module_names.add(
get_packet_module_name(packet_name, "serverbound")
)

View file

@ -135,25 +135,37 @@ def get_mappings_for_version(version_id: str):
return Mappings.parse(mappings_text)
def get_yarn_versions():
def get_fabric_data(version_id: str):
# https://meta.fabricmc.net/v2/versions/yarn
if not os.path.exists(get_dir_location("__cache__/yarn_versions.json")):
print("\033[92mDownloading yarn versions...\033[m")
yarn_versions_data = requests.get(
"https://meta.fabricmc.net/v2/versions/yarn"
).json()
with open(get_dir_location("__cache__/yarn_versions.json"), "w") as f:
path = get_dir_location(f"__cache__/fabric-{version_id}.json")
if not os.path.exists(path):
print(f"\033[92mDownloading Fabric metadata for {version_id}...\033[m")
url = f"https://meta.fabricmc.net/v1/versions/loader/{version_id}"
yarn_versions_data = requests.get(url).json()
with open(path, "w") as f:
json.dump(yarn_versions_data, f)
else:
with open(get_dir_location("__cache__/yarn_versions.json"), "r") as f:
with open(path, "r") as f:
yarn_versions_data = json.load(f)
return yarn_versions_data
def get_yarn_data(version_id: str):
for version in get_yarn_versions():
if version["gameVersion"] == version_id:
return version
def get_latest_fabric_api_version():
path = get_dir_location("__cache__/fabric-api-maven-metadata.xml")
if not os.path.exists(path):
print("\033[92mDownloading Fabric API metadata...\033[m")
url = "https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api/maven-metadata.xml"
maven_metadata_xml = requests.get(url).text
with open(path, "w") as f:
json.dump(maven_metadata_xml, f)
else:
with open(path, "r") as f:
maven_metadata_xml = json.load(f)
tree = ET.ElementTree(ET.fromstring(maven_metadata_xml))
return tree.find(".//latest").text
def get_fabric_api_versions():
@ -210,6 +222,7 @@ def clear_version_cache():
"yarn_versions.json",
"fabric_api_versions.json",
"fabric_loader_versions.json",
"fabric-api-maven-metadata.xml",
]
for file in files:
if os.path.exists(get_dir_location(f"__cache__/{file}")):

View file

@ -1,11 +1,14 @@
# Extracting data from the Minecraft jars
import shutil
from lib.download import (
get_latest_fabric_api_version,
get_mappings_for_version,
get_pumpkin_extractor,
get_server_jar,
get_burger,
get_client_jar,
get_fabric_data,
)
from lib.utils import get_dir_location, to_camel_case, upper_first_letter
from zipfile import ZipFile
@ -131,13 +134,51 @@ def get_pumpkin_data(version_id: str, category: str):
return json.load(f)
pumpkin_dir = get_pumpkin_extractor()
os.makedirs(f"{pumpkin_dir}/run", exist_ok=True)
with open(f"{pumpkin_dir}/run/eula.txt", "w") as f:
pumpkin_run_directory = f"{pumpkin_dir}/run"
if os.path.exists(pumpkin_run_directory):
shutil.rmtree(pumpkin_run_directory)
os.makedirs(pumpkin_run_directory, exist_ok=True)
with open(f"{pumpkin_run_directory}/eula.txt", "w") as f:
f.write("eula=true")
with open(f"{pumpkin_run_directory}/server.properties", "w") as f:
f.write("server-port=0")
fabric_data = get_fabric_data(version_id)[0]
fabric_api_version = get_latest_fabric_api_version()
gradle_properties = f"""# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
org.gradle.parallel=true
# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version={version_id}
yarn_mappings={fabric_data["mappings"]["version"]}
loader_version={fabric_data["loader"]["version"]}
kotlin_loader_version=1.13.2+kotlin.2.1.20
# Mod Properties
mod_version=1.0-SNAPSHOT
maven_group=de.snowii
archives_base_name=extractor
fabric_version={fabric_api_version}
"""
with open(f"{pumpkin_dir}/gradle.properties", "w") as f:
f.write(gradle_properties)
# update the minecraft version dependency in src/main/resources/fabric.mod.json
fabric_mod_json_path = f"{pumpkin_dir}/src/main/resources/fabric.mod.json"
with open(fabric_mod_json_path, "r") as f:
fabric_mod_json = f.read()
with open(fabric_mod_json_path, "w") as f:
fabric_mod_json = fabric_mod_json.replace(
'"minecraft": "${minecraft_version}"', '"minecraft": "*"'
)
f.write(fabric_mod_json)
# run ./gradlew runServer until it logs "(pumpkin_extractor) Done"
p = subprocess.Popen(
f"cd {pumpkin_dir} && ./gradlew runServer",
f"cd {pumpkin_dir} && ./gradlew clean && ./gradlew runServer",
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
shell=True,
@ -149,7 +190,7 @@ def get_pumpkin_data(version_id: str, category: str):
if "[Server thread/INFO] (pumpkin_extractor) Done" in data:
print("Pumpkin extractor done")
break
if data == b"":
if data == "":
break
p.terminate()

View file

@ -57,9 +57,10 @@ print('Generating registries...')
import genregistries
genregistries.generate(new_version_id)
print('Generating entity metadata...')
print('Generating entity data...')
burger_entities_data = new_burger_data[0]['entities']
lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings)
lib.code.entity.generate_entity_dimensions(burger_entities_data)
print('Generating item components...')
lib.code.item_components.generate(new_version_id)