azalea/
accept_resource_packs.rs1use 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#[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}