azalea/
accept_resource_packs.rs

1use azalea_client::InConfigState;
2use azalea_client::chunks::handle_chunk_batch_finished_event;
3use azalea_client::inventory::InventorySet;
4use azalea_client::packet::config::{SendConfigPacketEvent, handle_outgoing_packets};
5use azalea_client::packet::game::SendPacketEvent;
6use azalea_client::packet::{death_event_on_0_health, game::ResourcePackEvent};
7use azalea_client::respawn::perform_respawn;
8use azalea_protocol::packets::config;
9use azalea_protocol::packets::game::s_resource_pack::{self, ServerboundResourcePack};
10use bevy_app::Update;
11use bevy_ecs::prelude::*;
12
13use crate::app::{App, Plugin};
14
15/// A plugin that makes it so bots automatically accept resource packs.
16#[derive(Clone, Default)]
17pub struct AcceptResourcePacksPlugin;
18impl Plugin for AcceptResourcePacksPlugin {
19    fn build(&self, app: &mut App) {
20        app.add_systems(
21            Update,
22            accept_resource_pack
23                .before(perform_respawn)
24                .after(death_event_on_0_health)
25                .after(handle_chunk_batch_finished_event)
26                .after(InventorySet)
27                .before(handle_outgoing_packets)
28                .after(azalea_client::brand::handle_end_login_state),
29        );
30    }
31}
32
33fn accept_resource_pack(
34    mut events: EventReader<ResourcePackEvent>,
35    mut commands: Commands,
36    mut send_config_packet_events: EventWriter<SendConfigPacketEvent>,
37    query_in_config_state: Query<Option<&InConfigState>>,
38) {
39    for event in events.read() {
40        let Ok(in_config_state_option) = query_in_config_state.get(event.entity) else {
41            continue;
42        };
43
44        if in_config_state_option.is_some() {
45            send_config_packet_events.send(SendConfigPacketEvent::new(
46                event.entity,
47                config::ServerboundResourcePack {
48                    id: event.id,
49                    action: config::s_resource_pack::Action::Accepted,
50                },
51            ));
52            send_config_packet_events.send(SendConfigPacketEvent::new(
53                event.entity,
54                config::ServerboundResourcePack {
55                    id: event.id,
56                    action: config::s_resource_pack::Action::SuccessfullyLoaded,
57                },
58            ));
59        } else {
60            commands.trigger(SendPacketEvent::new(
61                event.entity,
62                ServerboundResourcePack {
63                    id: event.id,
64                    action: s_resource_pack::Action::Accepted,
65                },
66            ));
67            commands.trigger(SendPacketEvent::new(
68                event.entity,
69                ServerboundResourcePack {
70                    id: event.id,
71                    action: s_resource_pack::Action::SuccessfullyLoaded,
72                },
73            ));
74        }
75    }
76}