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;
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                .after(azalea_client::brand::handle_end_login_state),
28        );
29    }
30}
31
32fn accept_resource_pack(
33    mut events: EventReader<ResourcePackEvent>,
34    mut commands: Commands,
35    query_in_config_state: Query<Option<&InConfigState>>,
36) {
37    for event in events.read() {
38        let Ok(in_config_state_option) = query_in_config_state.get(event.entity) else {
39            continue;
40        };
41
42        if in_config_state_option.is_some() {
43            commands.trigger(SendConfigPacketEvent::new(
44                event.entity,
45                config::ServerboundResourcePack {
46                    id: event.id,
47                    action: config::s_resource_pack::Action::Accepted,
48                },
49            ));
50            commands.trigger(SendConfigPacketEvent::new(
51                event.entity,
52                config::ServerboundResourcePack {
53                    id: event.id,
54                    action: config::s_resource_pack::Action::SuccessfullyLoaded,
55                },
56            ));
57        } else {
58            commands.trigger(SendPacketEvent::new(
59                event.entity,
60                ServerboundResourcePack {
61                    id: event.id,
62                    action: s_resource_pack::Action::Accepted,
63                },
64            ));
65            commands.trigger(SendPacketEvent::new(
66                event.entity,
67                ServerboundResourcePack {
68                    id: event.id,
69                    action: s_resource_pack::Action::SuccessfullyLoaded,
70                },
71            ));
72        }
73    }
74}