diff options
| author | mat <git@matdoes.dev> | 2023-09-14 17:00:24 -0500 |
|---|---|---|
| committer | mat <git@matdoes.dev> | 2023-09-14 17:00:27 -0500 |
| commit | 3621acab758c8bd00ee08feee307a02512f234c8 (patch) | |
| tree | 57e6de3e621f65c84f45bf50f27973c66de03a07 | |
| parent | 83784d5a350168edaade4620122c2c6d46bc81a2 (diff) | |
| download | azalea-drasl-3621acab758c8bd00ee08feee307a02512f234c8.tar.xz | |
AcceptResourcePacksPlugin
| -rw-r--r-- | azalea-client/src/lib.rs | 2 | ||||
| -rw-r--r-- | azalea-client/src/packet_handling.rs | 30 | ||||
| -rw-r--r-- | azalea/src/accept_resource_packs.rs | 45 | ||||
| -rw-r--r-- | azalea/src/bot.rs | 2 | ||||
| -rw-r--r-- | azalea/src/lib.rs | 1 |
5 files changed, 72 insertions, 8 deletions
diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs index 8ea2fc41..942f683c 100644 --- a/azalea-client/src/lib.rs +++ b/azalea-client/src/lib.rs @@ -36,7 +36,7 @@ pub use client::{ TickBroadcast, }; pub use events::Event; -pub use local_player::{GameProfileComponent, LocalPlayer}; +pub use local_player::{GameProfileComponent, LocalPlayer, SendPacketEvent}; pub use movement::{ PhysicsState, SprintDirection, StartSprintEvent, StartWalkEvent, WalkDirection, }; diff --git a/azalea-client/src/packet_handling.rs b/azalea-client/src/packet_handling.rs index c95cbdba..cccd6153 100644 --- a/azalea-client/src/packet_handling.rs +++ b/azalea-client/src/packet_handling.rs @@ -1,6 +1,7 @@ use std::{collections::HashSet, io::Cursor, sync::Arc}; use azalea_buf::McBufWritable; +use azalea_chat::FormattedText; use azalea_core::{ChunkPos, GameMode, ResourceLocation, Vec3}; use azalea_entity::{ indexing::{EntityIdIndex, EntityUuidIndex}, @@ -16,8 +17,7 @@ use azalea_protocol::{ serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, serverbound_keep_alive_packet::ServerboundKeepAlivePacket, serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket, - serverbound_pong_packet::ServerboundPongPacket, - serverbound_resource_pack_packet::ServerboundResourcePackPacket, ClientboundGamePacket, + serverbound_pong_packet::ServerboundPongPacket, ClientboundGamePacket, ServerboundGamePacket, }, read::ReadPacketError, @@ -160,6 +160,15 @@ pub struct KeepAliveEvent { pub id: u64, } +#[derive(Event, Debug, Clone)] +pub struct ResourcePackEvent { + pub entity: Entity, + pub url: String, + pub hash: String, + pub required: bool, + pub prompt: Option<FormattedText>, +} + /// Something that receives packets from the server. #[derive(Event, Component, Clone)] pub struct PacketReceiver { @@ -1091,12 +1100,19 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundGamePacket::ResourcePack(p) => { debug!("Got resource pack packet {:?}", p); - let mut system_state: SystemState<Query<&mut LocalPlayer>> = SystemState::new(ecs); - let mut query = system_state.get_mut(ecs); + let mut system_state: SystemState<EventWriter<ResourcePackEvent>> = + SystemState::new(ecs); + let mut resource_pack_events = system_state.get_mut(ecs); - let local_player = query.get_mut(player_entity).unwrap(); - // always accept resource pack - local_player.write_packet(ServerboundResourcePackPacket { action: azalea_protocol::packets::game::serverbound_resource_pack_packet::Action::Accepted }.get()); + resource_pack_events.send(ResourcePackEvent { + entity: player_entity, + url: p.url, + hash: p.hash, + required: p.required, + prompt: p.prompt, + }); + + system_state.apply(ecs); } ClientboundGamePacket::Respawn(p) => { debug!("Got respawn packet {:?}", p); diff --git a/azalea/src/accept_resource_packs.rs b/azalea/src/accept_resource_packs.rs new file mode 100644 index 00000000..67d8aa65 --- /dev/null +++ b/azalea/src/accept_resource_packs.rs @@ -0,0 +1,45 @@ +use crate::app::{App, Plugin}; +use azalea_client::packet_handling::{death_event_on_0_health, ResourcePackEvent}; +use azalea_client::respawn::perform_respawn; +use azalea_client::SendPacketEvent; +use azalea_protocol::packets::game::serverbound_resource_pack_packet::{ + self, ServerboundResourcePackPacket, +}; +use bevy_app::Update; +use bevy_ecs::prelude::*; + +/// A plugin that makes it so bots automatically accept resource packs. +#[derive(Clone, Default)] +pub struct AcceptResourcePacksPlugin; +impl Plugin for AcceptResourcePacksPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + Update, + accept_resource_pack + .before(perform_respawn) + .after(death_event_on_0_health), + ); + } +} + +fn accept_resource_pack( + mut events: EventReader<ResourcePackEvent>, + mut send_packet_events: EventWriter<SendPacketEvent>, +) { + for event in events.iter() { + send_packet_events.send(SendPacketEvent { + entity: event.entity, + packet: ServerboundResourcePackPacket { + action: serverbound_resource_pack_packet::Action::Accepted, + } + .get(), + }); + send_packet_events.send(SendPacketEvent { + entity: event.entity, + packet: ServerboundResourcePackPacket { + action: serverbound_resource_pack_packet::Action::SuccessfullyLoaded, + } + .get(), + }); + } +} diff --git a/azalea/src/bot.rs b/azalea/src/bot.rs index 4c2a7a21..3b9e7e52 100644 --- a/azalea/src/bot.rs +++ b/azalea/src/bot.rs @@ -1,3 +1,4 @@ +use crate::accept_resource_packs::AcceptResourcePacksPlugin; use crate::app::{App, Plugin, PluginGroup, PluginGroupBuilder}; use crate::auto_respawn::AutoRespawnPlugin; use crate::container::ContainerPlugin; @@ -200,5 +201,6 @@ impl PluginGroup for DefaultBotPlugins { .add(PathfinderPlugin) .add(ContainerPlugin) .add(AutoRespawnPlugin) + .add(AcceptResourcePacksPlugin) } } diff --git a/azalea/src/lib.rs b/azalea/src/lib.rs index 0f1ed243..77e4ecf1 100644 --- a/azalea/src/lib.rs +++ b/azalea/src/lib.rs @@ -5,6 +5,7 @@ #![feature(type_changing_struct_update)] #![feature(lazy_cell)] +pub mod accept_resource_packs; mod auto_respawn; mod bot; pub mod container; |
