aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2023-09-14 17:00:24 -0500
committermat <git@matdoes.dev>2023-09-14 17:00:27 -0500
commit3621acab758c8bd00ee08feee307a02512f234c8 (patch)
tree57e6de3e621f65c84f45bf50f27973c66de03a07
parent83784d5a350168edaade4620122c2c6d46bc81a2 (diff)
downloadazalea-drasl-3621acab758c8bd00ee08feee307a02512f234c8.tar.xz
AcceptResourcePacksPlugin
-rw-r--r--azalea-client/src/lib.rs2
-rw-r--r--azalea-client/src/packet_handling.rs30
-rw-r--r--azalea/src/accept_resource_packs.rs45
-rw-r--r--azalea/src/bot.rs2
-rw-r--r--azalea/src/lib.rs1
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;