aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2023-08-25 23:28:19 -0500
committermat <git@matdoes.dev>2023-08-25 23:28:19 -0500
commit472496b7b808b4c6ac6f8e161a5bc1d08f5b0524 (patch)
treeb839d9c63829c3e215940f05cdcf0b17cd226300
parent2773146fbfd9b61c0ea09210b6d7b9760be5e7dc (diff)
downloadazalea-drasl-472496b7b808b4c6ac6f8e161a5bc1d08f5b0524.tar.xz
fix all bevy ambiguities
-rw-r--r--azalea-client/src/attack.rs15
-rw-r--r--azalea-client/src/client.rs14
-rw-r--r--azalea-client/src/events.rs2
-rw-r--r--azalea-client/src/interact.rs10
-rw-r--r--azalea-client/src/inventory.rs8
-rw-r--r--azalea-client/src/mining.rs19
-rw-r--r--azalea-client/src/movement.rs10
-rw-r--r--azalea-client/src/packet_handling.rs3
-rw-r--r--azalea-entity/src/plugin/indexing.rs1
-rw-r--r--azalea-entity/src/plugin/mod.rs4
-rw-r--r--azalea-physics/src/collision/mod.rs19
-rw-r--r--azalea-physics/src/lib.rs14
-rw-r--r--azalea/src/auto_respawn.rs9
-rw-r--r--azalea/src/bot.rs11
-rw-r--r--azalea/src/pathfinder/mod.rs13
-rw-r--r--tick.svg210
-rw-r--r--update.svg1137
17 files changed, 1448 insertions, 51 deletions
diff --git a/azalea-client/src/attack.rs b/azalea-client/src/attack.rs
index 34083ffc..45a4ccaf 100644
--- a/azalea-client/src/attack.rs
+++ b/azalea-client/src/attack.rs
@@ -1,8 +1,9 @@
use azalea_core::GameMode;
use azalea_entity::{
metadata::{ShiftKeyDown, Sprinting},
- Attributes, Physics,
+ update_bounding_box, Attributes, Physics,
};
+use azalea_physics::PhysicsSet;
use azalea_protocol::packets::game::serverbound_interact_packet::{
self, ServerboundInteractPacket,
};
@@ -14,6 +15,8 @@ use derive_more::{Deref, DerefMut};
use crate::{
interact::SwingArmEvent,
local_player::{LocalGameMode, SendPacketEvent},
+ movement::walk_listener,
+ respawn::perform_respawn,
Client,
};
@@ -21,12 +24,18 @@ pub struct AttackPlugin;
impl Plugin for AttackPlugin {
fn build(&self, app: &mut App) {
app.add_event::<AttackEvent>()
- .add_systems(Update, handle_attack_event)
+ .add_systems(
+ Update,
+ handle_attack_event
+ .before(update_bounding_box)
+ .before(walk_listener)
+ .after(perform_respawn),
+ )
.add_systems(
FixedUpdate,
(
increment_ticks_since_last_attack,
- update_attack_strength_scale,
+ update_attack_strength_scale.after(PhysicsSet),
)
.chain(),
);
diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs
index b44e8b4e..517db4e9 100644
--- a/azalea-client/src/client.rs
+++ b/azalea-client/src/client.rs
@@ -25,7 +25,7 @@ use azalea_entity::{
indexing::EntityIdIndex, metadata::Health, EntityPlugin, EntityUpdateSet, EyeHeight, Local,
Position,
};
-use azalea_physics::{PhysicsPlugin, PhysicsSet};
+use azalea_physics::PhysicsPlugin;
use azalea_protocol::{
connect::{Connection, ConnectionError},
packets::{
@@ -48,7 +48,7 @@ use azalea_protocol::{
resolver, ServerAddress,
};
use azalea_world::{Instance, InstanceContainer, InstanceName, PartialInstance};
-use bevy_app::{App, FixedUpdate, Main, Plugin, PluginGroup, PluginGroupBuilder, Update};
+use bevy_app::{App, FixedUpdate, Plugin, PluginGroup, PluginGroupBuilder, Update};
use bevy_ecs::{
bundle::Bundle,
component::Component,
@@ -617,7 +617,7 @@ impl Plugin for AzaleaPlugin {
.add_systems(
Update,
(
- update_in_loaded_chunk.after(PhysicsSet),
+ update_in_loaded_chunk,
// fire the Death event when the player dies.
death_event,
// add GameProfileComponent when we get an AddPlayerEvent
@@ -721,7 +721,13 @@ impl Plugin for TickBroadcastPlugin {
pub struct AmbiguityLoggerPlugin;
impl Plugin for AmbiguityLoggerPlugin {
fn build(&self, app: &mut App) {
- app.edit_schedule(Main, |schedule| {
+ app.edit_schedule(Update, |schedule| {
+ schedule.set_build_settings(ScheduleBuildSettings {
+ ambiguity_detection: LogLevel::Warn,
+ ..Default::default()
+ });
+ });
+ app.edit_schedule(FixedUpdate, |schedule| {
schedule.set_build_settings(ScheduleBuildSettings {
ambiguity_detection: LogLevel::Warn,
..Default::default()
diff --git a/azalea-client/src/events.rs b/azalea-client/src/events.rs
index d5a32449..0d34d47b 100644
--- a/azalea-client/src/events.rs
+++ b/azalea-client/src/events.rs
@@ -209,7 +209,7 @@ fn remove_player_listener(
}
}
-fn death_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<DeathEvent>) {
+pub fn death_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader<DeathEvent>) {
for event in events.iter() {
if let Ok(local_player_events) = query.get(event.entity) {
local_player_events
diff --git a/azalea-client/src/interact.rs b/azalea-client/src/interact.rs
index 3c9428ff..2f7480cb 100644
--- a/azalea-client/src/interact.rs
+++ b/azalea-client/src/interact.rs
@@ -28,7 +28,7 @@ use log::warn;
use crate::{
client::{PermissionLevel, PlayerAbilities},
- inventory::InventoryComponent,
+ inventory::{InventoryComponent, InventorySet},
local_player::{handle_send_packet_event, LocalGameMode, SendPacketEvent},
Client, LocalPlayer,
};
@@ -49,7 +49,9 @@ impl Plugin for InteractPlugin {
)
.before(handle_send_packet_event)
.chain(),
- update_modifiers_for_held_item,
+ update_modifiers_for_held_item
+ .after(InventorySet)
+ .after(crate::movement::walk_listener),
),
);
}
@@ -151,7 +153,7 @@ pub fn handle_block_interact_event(
}
#[allow(clippy::type_complexity)]
-fn update_hit_result_component(
+pub fn update_hit_result_component(
mut commands: Commands,
mut query: Query<(
Entity,
@@ -297,7 +299,7 @@ pub fn can_use_game_master_blocks(
pub struct SwingArmEvent {
pub entity: Entity,
}
-fn handle_swing_arm_event(
+pub fn handle_swing_arm_event(
mut events: EventReader<SwingArmEvent>,
mut send_packet_events: EventWriter<SendPacketEvent>,
) {
diff --git a/azalea-client/src/inventory.rs b/azalea-client/src/inventory.rs
index 6f7829de..da5376fc 100644
--- a/azalea-client/src/inventory.rs
+++ b/azalea-client/src/inventory.rs
@@ -20,7 +20,7 @@ use bevy_ecs::{
entity::Entity,
event::EventReader,
prelude::{Event, EventWriter},
- schedule::IntoSystemConfigs,
+ schedule::{IntoSystemConfigs, SystemSet},
system::Query,
};
use log::warn;
@@ -44,11 +44,15 @@ impl Plugin for InventoryPlugin {
handle_container_close_event.before(handle_send_packet_event),
handle_client_side_close_container_event,
)
- .chain(),
+ .chain()
+ .in_set(InventorySet),
);
}
}
+#[derive(SystemSet, Debug, Hash, PartialEq, Eq, Clone)]
+pub struct InventorySet;
+
impl Client {
/// Return the menu that is currently open. If no menu is open, this will
/// have the player's inventory.
diff --git a/azalea-client/src/mining.rs b/azalea-client/src/mining.rs
index c087c467..3d43e712 100644
--- a/azalea-client/src/mining.rs
+++ b/azalea-client/src/mining.rs
@@ -2,6 +2,7 @@ use azalea_block::{Block, BlockState, FluidState};
use azalea_core::{BlockPos, Direction, GameMode};
use azalea_entity::{mining::get_mine_progress, FluidOnEyes, Physics};
use azalea_inventory::ItemSlot;
+use azalea_physics::PhysicsSet;
use azalea_protocol::packets::game::serverbound_player_action_packet::{
self, ServerboundPlayerActionPacket,
};
@@ -16,7 +17,7 @@ use crate::{
can_use_game_master_blocks, check_is_interaction_restricted, CurrentSequenceNumber,
HitResultComponent, SwingArmEvent,
},
- inventory::InventoryComponent,
+ inventory::{InventoryComponent, InventorySet},
local_player::{LocalGameMode, SendPacketEvent},
Client,
};
@@ -31,7 +32,7 @@ impl Plugin for MinePlugin {
.add_event::<StopMiningBlockEvent>()
.add_event::<MineBlockProgressEvent>()
.add_event::<AttackBlockEvent>()
- .add_systems(FixedUpdate, continue_mining_block)
+ .add_systems(FixedUpdate, continue_mining_block.before(PhysicsSet))
.add_systems(
Update,
(
@@ -40,11 +41,23 @@ impl Plugin for MinePlugin {
handle_finish_mining_block_event,
handle_stop_mining_block_event,
)
- .chain(),
+ .chain()
+ .in_set(MiningSet)
+ .after(InventorySet)
+ .before(azalea_entity::update_bounding_box)
+ .after(azalea_entity::update_fluid_on_eyes)
+ .after(crate::interact::update_hit_result_component)
+ .after(crate::attack::handle_attack_event)
+ .after(crate::interact::handle_block_interact_event)
+ .before(crate::interact::handle_swing_arm_event)
+ .before(azalea_physics::handle_force_jump),
);
}
}
+#[derive(SystemSet, Debug, Hash, PartialEq, Eq, Clone)]
+pub struct MiningSet;
+
impl Client {
pub fn start_mining(&mut self, position: BlockPos) {
self.ecs.lock().send_event(StartMiningBlockEvent {
diff --git a/azalea-client/src/movement.rs b/azalea-client/src/movement.rs
index 919be0e6..b1e58324 100644
--- a/azalea-client/src/movement.rs
+++ b/azalea-client/src/movement.rs
@@ -1,8 +1,8 @@
use crate::client::Client;
-use crate::local_player::{update_in_loaded_chunk, LocalPlayer, LocalPlayerInLoadedChunk};
+use crate::local_player::{LocalPlayer, LocalPlayerInLoadedChunk};
use azalea_entity::{metadata::Sprinting, Attributes, Jumping};
use azalea_entity::{LastSentPosition, LookDirection, Physics, Position};
-use azalea_physics::{force_jump_listener, PhysicsSet};
+use azalea_physics::{handle_force_jump, PhysicsSet};
use azalea_protocol::packets::game::serverbound_player_command_packet::ServerboundPlayerCommandPacket;
use azalea_protocol::packets::game::{
serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket,
@@ -48,7 +48,7 @@ impl Plugin for PlayerMovePlugin {
Update,
(sprint_listener, walk_listener)
.chain()
- .before(force_jump_listener),
+ .before(handle_force_jump),
)
.add_systems(
FixedUpdate,
@@ -56,7 +56,7 @@ impl Plugin for PlayerMovePlugin {
local_player_ai_step
.in_set(PhysicsSet)
.before(azalea_physics::ai_step),
- send_position.after(update_in_loaded_chunk),
+ send_position.after(PhysicsSet),
)
.chain(),
);
@@ -120,7 +120,7 @@ pub struct PhysicsState {
}
#[allow(clippy::type_complexity)]
-pub(crate) fn send_position(
+pub fn send_position(
mut query: Query<
(
&MinecraftEntityId,
diff --git a/azalea-client/src/packet_handling.rs b/azalea-client/src/packet_handling.rs
index 0b6e23b1..605da379 100644
--- a/azalea-client/src/packet_handling.rs
+++ b/azalea-client/src/packet_handling.rs
@@ -42,6 +42,7 @@ use crate::{
chat::{ChatPacket, ChatReceivedEvent},
client::{PlayerAbilities, TabList},
disconnect::DisconnectEvent,
+ events::death_listener,
inventory::{
ClientSideCloseContainerEvent, InventoryComponent, MenuOpenedEvent,
SetContainerContentEvent,
@@ -90,7 +91,7 @@ impl Plugin for PacketHandlerPlugin {
// we want to index and deindex right after
.before(EntityUpdateSet::Deindex),
)
- .add_systems(Update, death_event_on_0_health)
+ .add_systems(Update, death_event_on_0_health.before(death_listener))
.init_resource::<Events<PacketEvent>>()
.add_event::<AddPlayerEvent>()
.add_event::<RemovePlayerEvent>()
diff --git a/azalea-entity/src/plugin/indexing.rs b/azalea-entity/src/plugin/indexing.rs
index 3c311df9..be5c0a5b 100644
--- a/azalea-entity/src/plugin/indexing.rs
+++ b/azalea-entity/src/plugin/indexing.rs
@@ -117,7 +117,6 @@ pub fn deduplicate_entities(
entity_id_index.insert(*id, *old_entity);
}
-
let old_loaded_by = loaded_by_query.get_mut(*old_entity);
// merge them if possible
if let Ok(mut old_loaded_by) = old_loaded_by {
diff --git a/azalea-entity/src/plugin/mod.rs b/azalea-entity/src/plugin/mod.rs
index a1c7fcff..41ec4e6a 100644
--- a/azalea-entity/src/plugin/mod.rs
+++ b/azalea-entity/src/plugin/mod.rs
@@ -5,7 +5,7 @@ use std::collections::HashSet;
use azalea_core::{BlockPos, Vec3};
use azalea_world::{InstanceContainer, InstanceName, MinecraftEntityId};
-use bevy_app::{App, FixedUpdate, Plugin, PostUpdate, PreUpdate, Update};
+use bevy_app::{App, Plugin, PostUpdate, PreUpdate, Update};
use bevy_ecs::prelude::*;
use derive_more::{Deref, DerefMut};
use log::debug;
@@ -68,7 +68,7 @@ impl Plugin for EntityPlugin {
),
),
)
- .add_systems(FixedUpdate, update_bounding_box)
+ .add_systems(Update, update_bounding_box)
.init_resource::<EntityUuidIndex>();
}
}
diff --git a/azalea-physics/src/collision/mod.rs b/azalea-physics/src/collision/mod.rs
index 5d3da699..de9439ca 100644
--- a/azalea-physics/src/collision/mod.rs
+++ b/azalea-physics/src/collision/mod.rs
@@ -60,7 +60,12 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
let collided_movement = if movement.length_sqr() == 0.0 {
*movement
} else {
- collide_bounding_box(movement, &entity_bounding_box, world, entity_collisions.clone())
+ collide_bounding_box(
+ movement,
+ &entity_bounding_box,
+ world,
+ entity_collisions.clone(),
+ )
};
let x_collision = movement.x != collided_movement.x;
@@ -70,9 +75,8 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
let on_ground = physics.on_ground || y_collision && movement.y < 0.;
let max_up_step = 0.6;
- if on_ground && (x_collision || z_collision) {
- let mut hypothetical_new_position
- = collide_bounding_box(
+ if on_ground && (x_collision || z_collision) {
+ let mut hypothetical_new_position = collide_bounding_box(
&Vec3 {
x: movement.x,
y: max_up_step,
@@ -104,12 +108,15 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
entity_collisions.clone(),
)
.add(step_up_position);
- if var11.horizontal_distance_sqr() > hypothetical_new_position.horizontal_distance_sqr() {
+ if var11.horizontal_distance_sqr() > hypothetical_new_position.horizontal_distance_sqr()
+ {
hypothetical_new_position = var11;
}
}
- if hypothetical_new_position.horizontal_distance_sqr() > collided_movement.horizontal_distance_sqr() {
+ if hypothetical_new_position.horizontal_distance_sqr()
+ > collided_movement.horizontal_distance_sqr()
+ {
return hypothetical_new_position.add(collide_bounding_box(
&Vec3 {
x: 0.,
diff --git a/azalea-physics/src/lib.rs b/azalea-physics/src/lib.rs
index 50b2c11b..9ff605b9 100644
--- a/azalea-physics/src/lib.rs
+++ b/azalea-physics/src/lib.rs
@@ -33,15 +33,11 @@ impl Plugin for PhysicsPlugin {
app.add_event::<ForceJumpEvent>()
.add_systems(
Update,
- force_jump_listener.after(azalea_entity::clamp_look_direction),
+ handle_force_jump
+ .after(azalea_entity::clamp_look_direction)
+ .before(azalea_entity::update_bounding_box),
)
- .add_systems(
- FixedUpdate,
- (ai_step, travel)
- .chain()
- .in_set(PhysicsSet)
- .after(azalea_entity::update_bounding_box),
- );
+ .add_systems(FixedUpdate, (ai_step, travel).chain().in_set(PhysicsSet));
}
}
@@ -173,7 +169,7 @@ pub fn ai_step(
#[derive(Event)]
pub struct ForceJumpEvent(pub Entity);
-pub fn force_jump_listener(
+pub fn handle_force_jump(
mut query: Query<(
&mut Physics,
&Position,
diff --git a/azalea/src/auto_respawn.rs b/azalea/src/auto_respawn.rs
index 77a75b4b..7034c86b 100644
--- a/azalea/src/auto_respawn.rs
+++ b/azalea/src/auto_respawn.rs
@@ -1,5 +1,5 @@
use crate::app::{App, Plugin};
-use azalea_client::packet_handling::DeathEvent;
+use azalea_client::packet_handling::{death_event_on_0_health, DeathEvent};
use azalea_client::respawn::{perform_respawn, PerformRespawnEvent};
use bevy_app::Update;
use bevy_ecs::prelude::*;
@@ -9,7 +9,12 @@ use bevy_ecs::prelude::*;
pub struct AutoRespawnPlugin;
impl Plugin for AutoRespawnPlugin {
fn build(&self, app: &mut App) {
- app.add_systems(Update, auto_respawn.before(perform_respawn));
+ app.add_systems(
+ Update,
+ auto_respawn
+ .before(perform_respawn)
+ .after(death_event_on_0_health),
+ );
}
}
diff --git a/azalea/src/bot.rs b/azalea/src/bot.rs
index 40ab4124..10bf1161 100644
--- a/azalea/src/bot.rs
+++ b/azalea/src/bot.rs
@@ -15,7 +15,7 @@ use azalea_core::{BlockPos, Vec3};
use azalea_entity::{
clamp_look_direction, metadata::Player, EyeHeight, Jumping, Local, LookDirection, Position,
};
-use azalea_physics::{force_jump_listener, PhysicsSet};
+use azalea_physics::{handle_force_jump, PhysicsSet};
use bevy_app::{FixedUpdate, Update};
use bevy_ecs::prelude::Event;
use bevy_ecs::schedule::IntoSystemConfigs;
@@ -35,9 +35,9 @@ impl Plugin for BotPlugin {
(
insert_bot,
look_at_listener
- .before(force_jump_listener)
+ .before(handle_force_jump)
.before(clamp_look_direction),
- jump_listener,
+ jump_listener.before(handle_force_jump),
),
)
.add_systems(FixedUpdate, stop_jumping.after(PhysicsSet));
@@ -138,7 +138,10 @@ impl BotClientExt for azalea_client::Client {
#[derive(Event)]
pub struct JumpEvent(pub Entity);
-fn jump_listener(mut query: Query<(&mut Jumping, &mut Bot)>, mut events: EventReader<JumpEvent>) {
+pub fn jump_listener(
+ mut query: Query<(&mut Jumping, &mut Bot)>,
+ mut events: EventReader<JumpEvent>,
+) {
for event in events.iter() {
if let Ok((mut jumping, mut bot)) = query.get_mut(event.0) {
**jumping = true;
diff --git a/azalea/src/pathfinder/mod.rs b/azalea/src/pathfinder/mod.rs
index ae88b0cc..03a75599 100644
--- a/azalea/src/pathfinder/mod.rs
+++ b/azalea/src/pathfinder/mod.rs
@@ -16,6 +16,7 @@ use crate::ecs::{
system::{Commands, Query, Res},
};
use astar::Edge;
+use azalea_client::movement::walk_listener;
use azalea_client::{StartSprintEvent, StartWalkEvent};
use azalea_core::{BlockPos, CardinalDirection};
use azalea_entity::metadata::Player;
@@ -43,16 +44,20 @@ impl Plugin for PathfinderPlugin {
FixedUpdate,
// putting systems in the FixedUpdate schedule makes them run every Minecraft tick
// (every 50 milliseconds).
- tick_execute_path.after(PhysicsSet),
+ tick_execute_path
+ .after(PhysicsSet)
+ .after(azalea_client::movement::send_position),
)
.add_systems(PreUpdate, add_default_pathfinder)
.add_systems(
Update,
(
goto_listener,
- (handle_tasks, path_found_listener).chain(),
- stop_pathfinding_on_instance_change,
- ),
+ handle_tasks,
+ path_found_listener,
+ stop_pathfinding_on_instance_change.before(walk_listener),
+ )
+ .chain(),
);
}
}
diff --git a/tick.svg b/tick.svg
new file mode 100644
index 00000000..049bf4fc
--- /dev/null
+++ b/tick.svg
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 8.1.0 (0)
+ -->
+<!-- Pages: 1 -->
+<svg width="752pt" height="251pt"
+ viewBox="0.00 0.00 752.25 250.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 246.8)">
+<polygon fill="#0d1117" stroke="none" points="-4,4 -4,-246.8 748.25,-246.8 748.25,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>clusternode_Set(1)</title>
+<g id="a_clust1"><a xlink:title="PhysicsSet">
+<path fill="#ffffff" fill-opacity="0.266667" stroke="#ffffff" stroke-width="2" stroke-opacity="0.313725" d="M216.5,-111.8C216.5,-111.8 710.12,-111.8 710.12,-111.8 716.12,-111.8 722.12,-117.8 722.12,-123.8 722.12,-123.8 722.12,-186.8 722.12,-186.8 722.12,-192.8 716.12,-198.8 710.12,-198.8 710.12,-198.8 216.5,-198.8 216.5,-198.8 210.5,-198.8 204.5,-192.8 204.5,-186.8 204.5,-186.8 204.5,-123.8 204.5,-123.8 204.5,-117.8 210.5,-111.8 216.5,-111.8"/>
+<text text-anchor="middle" x="463.31" y="-181.5" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#ffffff">PhysicsSet</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(1) -->
+<!-- node_System(4) -->
+<g id="node6" class="node">
+<title>node_System(4)</title>
+<g id="a_node6"><a xlink:title="azalea_client::movement::send_position">
+<polygon fill="lightgrey" stroke="black" points="552,-103.8 461,-103.8 461,-67.8 552,-67.8 552,-103.8"/>
+<text text-anchor="middle" x="506.5" y="-80.75" font-family="Times,serif" font-size="14.00">send_position</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(1)&#45;&gt;node_System(4) -->
+<g id="edge3" class="edge">
+<title>set_marker_node_Set(1)&#45;&gt;node_System(4)</title>
+<g id="a_edge3"><a xlink:title="PhysicsSet → send_position">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M335.33,-111.8C369.11,-106.64 413.06,-99.92 447.84,-94.61"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="449.3,-97.62 458.66,-92.65 448.24,-90.7 449.3,-97.62"/>
+</a>
+</g>
+</g>
+<!-- node_System(7) -->
+<g id="node9" class="node">
+<title>node_System(7)</title>
+<g id="a_node9"><a xlink:title="azalea_client::attack::update_attack_strength_scale">
+<polygon fill="lightgrey" stroke="black" points="594,-242.8 419,-242.8 419,-206.8 594,-206.8 594,-242.8"/>
+<text text-anchor="middle" x="506.5" y="-219.75" font-family="Times,serif" font-size="14.00">update_attack_strength_scale</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(1)&#45;&gt;node_System(7) -->
+<g id="edge6" class="edge">
+<title>set_marker_node_Set(1)&#45;&gt;node_System(7)</title>
+<g id="a_edge6"><a xlink:title="PhysicsSet → update_attack_strength_scale">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M283.05,-119.78C284.96,-119.22 346.62,-101.35 418.35,-198.8"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="414.85,-200.16 424.59,-204.31 419.56,-194.99 414.85,-200.16"/>
+</a>
+</g>
+</g>
+<!-- node_System(9) -->
+<g id="node11" class="node">
+<title>node_System(9)</title>
+<g id="a_node11"><a xlink:title="azalea::bot::stop_jumping">
+<polygon fill="lightgrey" stroke="black" points="552,-56.8 461,-56.8 461,-20.8 552,-20.8 552,-56.8"/>
+<text text-anchor="middle" x="506.5" y="-33.75" font-family="Times,serif" font-size="14.00">stop_jumping</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(1)&#45;&gt;node_System(9) -->
+<g id="edge8" class="edge">
+<title>set_marker_node_Set(1)&#45;&gt;node_System(9)</title>
+<g id="a_edge8"><a xlink:title="PhysicsSet → stop_jumping">
+<path fill="none" stroke="#663699" stroke-width="2" d="M299.6,-111.8C324.92,-99.81 374.91,-76.97 419,-61.8 428.4,-58.56 438.51,-55.5 448.38,-52.74"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="449.95,-55.4 458.68,-49.41 448.12,-48.64 449.95,-55.4"/>
+</a>
+</g>
+</g>
+<!-- node_System(10) -->
+<g id="node12" class="node">
+<title>node_System(10)</title>
+<g id="a_node12"><a xlink:title="azalea::pathfinder::tick_execute_path">
+<polygon fill="lightgrey" stroke="black" points="744.25,-62.8 630,-62.8 630,-26.8 744.25,-26.8 744.25,-62.8"/>
+<text text-anchor="middle" x="687.12" y="-39.75" font-family="Times,serif" font-size="14.00">tick_execute_path</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(1)&#45;&gt;node_System(10) -->
+<g id="edge9" class="edge">
+<title>set_marker_node_Set(1)&#45;&gt;node_System(10)</title>
+<g id="a_edge9"><a xlink:title="PhysicsSet → tick_execute_path">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M289.72,-111.8C307.91,-90.86 360.67,-34.69 419,-14.8 492.61,10.31 517.18,-2.6 594,-14.8 604.75,-16.5 615.94,-19.26 626.68,-22.43"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="626.42,-26.65 637.01,-26.31 628.52,-19.97 626.42,-26.65"/>
+</a>
+</g>
+</g>
+<!-- node_System(0) -->
+<g id="node2" class="node">
+<title>node_System(0)</title>
+<g id="a_node2"><a xlink:title="azalea_physics::ai_step">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="536.25,-166.8 476.75,-166.8 476.75,-130.8 536.25,-130.8 536.25,-166.8"/>
+<text text-anchor="middle" x="506.5" y="-143.37" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">ai_step</text>
+</a>
+</g>
+</g>
+<!-- node_System(1) -->
+<g id="node3" class="node">
+<title>node_System(1)</title>
+<g id="a_node3"><a xlink:title="azalea_physics::travel">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="714.12,-166.8 660.12,-166.8 660.12,-130.8 714.12,-130.8 714.12,-166.8"/>
+<text text-anchor="middle" x="687.12" y="-143.37" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">travel</text>
+</a>
+</g>
+</g>
+<!-- node_System(0)&#45;&gt;node_System(1) -->
+<g id="edge1" class="edge">
+<title>node_System(0)&#45;&gt;node_System(1)</title>
+<g id="a_edge1"><a xlink:title="ai_step → travel">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M536.6,-148.8C566.57,-148.8 613.49,-148.8 646.77,-148.8"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="646.66,-152.3 656.66,-148.8 646.66,-145.3 646.66,-152.3"/>
+</a>
+</g>
+</g>
+<!-- node_System(3) -->
+<g id="node4" class="node">
+<title>node_System(3)</title>
+<g id="a_node4"><a xlink:title="azalea_client::movement::local_player_ai_step">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="351.5,-166.8 212.5,-166.8 212.5,-130.8 351.5,-130.8 351.5,-166.8"/>
+<text text-anchor="middle" x="282" y="-143.37" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">local_player_ai_step</text>
+</a>
+</g>
+</g>
+<!-- node_System(3)&#45;&gt;node_System(0) -->
+<g id="edge2" class="edge">
+<title>node_System(3)&#45;&gt;node_System(0)</title>
+<g id="a_edge2"><a xlink:title="local_player_ai_step → SystemTypeSet(ai_step&quot;)">
+<path fill="none" stroke="#881877" stroke-width="2" d="M351.88,-148.8C388.51,-148.8 432.34,-148.8 463.79,-148.8"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="463.46,-152.3 473.46,-148.8 463.46,-145.3 463.46,-152.3"/>
+</a>
+</g>
+</g>
+<!-- node_System(3)&#45;&gt;node_System(4) -->
+<g id="edge4" class="edge">
+<title>node_System(3)&#45;&gt;node_System(4)</title>
+<g id="a_edge4"><a xlink:title="local_player_ai_step → send_position">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M351.8,-134.81C362.34,-132.14 373.03,-129.12 383,-125.8 399.61,-120.25 402.52,-115.71 419,-109.8 428.39,-106.43 438.48,-103.25 448.35,-100.36"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="449.99,-102.97 458.66,-96.89 448.08,-96.24 449.99,-102.97"/>
+</a>
+</g>
+</g>
+<!-- node_System(2) -->
+<g id="node5" class="node">
+<title>node_System(2)</title>
+<g id="a_node5"><a xlink:title="azalea_client::events::tick_listener">
+<polygon fill="lightgrey" stroke="black" points="113.88,-184.8 31.12,-184.8 31.12,-148.8 113.88,-148.8 113.88,-184.8"/>
+<text text-anchor="middle" x="72.5" y="-161.75" font-family="Times,serif" font-size="14.00">tick_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(4)&#45;&gt;node_System(10) -->
+<g id="edge10" class="edge">
+<title>node_System(4)&#45;&gt;node_System(10)</title>
+<g id="a_edge10"><a xlink:title="SystemTypeSet(send_position&quot;) → tick_execute_path">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M552.11,-75.56C571.72,-71.05 595.2,-65.67 616.99,-60.66"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="618.62,-63.42 627.59,-57.77 617.06,-56.6 618.62,-63.42"/>
+</a>
+</g>
+</g>
+<!-- node_System(5) -->
+<g id="node7" class="node">
+<title>node_System(5)</title>
+<g id="a_node7"><a xlink:title="azalea_client::mining::continue_mining_block">
+<polygon fill="lightgrey" stroke="black" points="145,-137.8 0,-137.8 0,-101.8 145,-101.8 145,-137.8"/>
+<text text-anchor="middle" x="72.5" y="-114.75" font-family="Times,serif" font-size="14.00">continue_mining_block</text>
+</a>
+</g>
+</g>
+<!-- node_System(5)&#45;&gt;set_marker_node_Set(1) -->
+<g id="edge5" class="edge">
+<title>node_System(5)&#45;&gt;set_marker_node_Set(1)</title>
+<g id="a_edge5"><a xlink:title="continue_mining_block → PhysicsSet">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M145.49,-119.8C160.39,-119.8 176.25,-119.8 191.68,-119.8"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="191.5,-123.3 201.5,-119.8 191.5,-116.3 191.5,-123.3"/>
+</a>
+</g>
+</g>
+<!-- node_System(6) -->
+<g id="node8" class="node">
+<title>node_System(6)</title>
+<g id="a_node8"><a xlink:title="azalea_client::attack::increment_ticks_since_last_attack">
+<polygon fill="lightgrey" stroke="black" points="383,-242.8 181,-242.8 181,-206.8 383,-206.8 383,-242.8"/>
+<text text-anchor="middle" x="282" y="-219.75" font-family="Times,serif" font-size="14.00">increment_ticks_since_last_attack</text>
+</a>
+</g>
+</g>
+<!-- node_System(6)&#45;&gt;node_System(7) -->
+<g id="edge7" class="edge">
+<title>node_System(6)&#45;&gt;node_System(7)</title>
+<g id="a_edge7"><a xlink:title="increment_ticks_since_last_attack → update_attack_strength_scale">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M383.18,-224.8C390.7,-224.8 398.29,-224.8 405.8,-224.8"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="405.79,-228.3 415.79,-224.8 405.79,-221.3 405.79,-228.3"/>
+</a>
+</g>
+</g>
+<!-- node_System(8) -->
+<g id="node10" class="node">
+<title>node_System(8)</title>
+<g id="a_node10"><a xlink:title="azalea_client::client::send_tick_broadcast">
+<polygon fill="lightgrey" stroke="black" points="135.62,-231.8 9.38,-231.8 9.38,-195.8 135.62,-195.8 135.62,-231.8"/>
+<text text-anchor="middle" x="72.5" y="-208.75" font-family="Times,serif" font-size="14.00">send_tick_broadcast</text>
+</a>
+</g>
+</g>
+</g>
+</svg>
diff --git a/update.svg b/update.svg
new file mode 100644
index 00000000..852dc447
--- /dev/null
+++ b/update.svg
@@ -0,0 +1,1137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 8.1.0 (0)
+ -->
+<!-- Pages: 1 -->
+<svg width="2807pt" height="1345pt"
+ viewBox="0.00 0.00 2806.75 1345.10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1341.1)">
+<polygon fill="#0d1117" stroke="none" points="-4,4 -4,-1341.1 2802.75,-1341.1 2802.75,4 -4,4"/>
+<g id="clust1" class="cluster">
+<title>clusternode_Set(5)</title>
+<g id="a_clust1"><a xlink:title="Index">
+<path fill="#ffffff" fill-opacity="0.266667" stroke="#ffffff" stroke-width="2" stroke-opacity="0.313725" d="M47.12,-236.1C47.12,-236.1 240.38,-236.1 240.38,-236.1 246.38,-236.1 252.38,-242.1 252.38,-248.1 252.38,-248.1 252.38,-405.1 252.38,-405.1 252.38,-411.1 246.38,-417.1 240.38,-417.1 240.38,-417.1 47.12,-417.1 47.12,-417.1 41.12,-417.1 35.12,-411.1 35.12,-405.1 35.12,-405.1 35.12,-248.1 35.12,-248.1 35.12,-242.1 41.12,-236.1 47.12,-236.1"/>
+<text text-anchor="middle" x="143.75" y="-399.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#ffffff">Index</text>
+</a>
+</g>
+</g>
+<g id="clust2" class="cluster">
+<title>clusternode_Set(26)</title>
+<g id="a_clust2"><a xlink:title="InventorySet">
+<path fill="#ffffff" fill-opacity="0.266667" stroke="#ffffff" stroke-width="2" stroke-opacity="0.313725" d="M808.38,-634.1C808.38,-634.1 2190.25,-634.1 2190.25,-634.1 2196.25,-634.1 2202.25,-640.1 2202.25,-646.1 2202.25,-646.1 2202.25,-709.1 2202.25,-709.1 2202.25,-715.1 2196.25,-721.1 2190.25,-721.1 2190.25,-721.1 808.38,-721.1 808.38,-721.1 802.38,-721.1 796.38,-715.1 796.38,-709.1 796.38,-709.1 796.38,-646.1 796.38,-646.1 796.38,-640.1 802.38,-634.1 808.38,-634.1"/>
+<text text-anchor="middle" x="1499.31" y="-703.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#ffffff">InventorySet</text>
+</a>
+</g>
+</g>
+<g id="clust3" class="cluster">
+<title>clusternode_Set(41)</title>
+<g id="a_clust3"><a xlink:title="MiningSet">
+<path fill="#ffffff" fill-opacity="0.266667" stroke="#ffffff" stroke-width="2" stroke-opacity="0.313725" d="M1061.75,-229.1C1061.75,-229.1 2163.62,-229.1 2163.62,-229.1 2169.62,-229.1 2175.62,-235.1 2175.62,-241.1 2175.62,-241.1 2175.62,-304.1 2175.62,-304.1 2175.62,-310.1 2169.62,-316.1 2163.62,-316.1 2163.62,-316.1 1061.75,-316.1 1061.75,-316.1 1055.75,-316.1 1049.75,-310.1 1049.75,-304.1 1049.75,-304.1 1049.75,-241.1 1049.75,-241.1 1049.75,-235.1 1055.75,-229.1 1061.75,-229.1"/>
+<text text-anchor="middle" x="1612.69" y="-298.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#ffffff">MiningSet</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(5) -->
+<!-- node_System(3) -->
+<g id="node19" class="node">
+<title>node_System(3)</title>
+<g id="a_node19"><a xlink:title="azalea_client::player::retroactively_add_game_profile_component">
+<polygon fill="lightgrey" stroke="black" points="581,-403.1 323.5,-403.1 323.5,-367.1 581,-367.1 581,-403.1"/>
+<text text-anchor="middle" x="452.25" y="-380.05" font-family="Times,serif" font-size="14.00">retroactively_add_game_profile_component</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(5)&#45;&gt;node_System(3) -->
+<g id="edge2" class="edge">
+<title>set_marker_node_Set(5)&#45;&gt;node_System(3)</title>
+<g id="a_edge2"><a xlink:title="Index → retroactively_add_game_profile_component">
+<path fill="none" stroke="#881877" stroke-width="2" d="M252.37,-385.1C271.2,-385.1 291.05,-385.1 310.61,-385.1"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="310.3,-388.6 320.3,-385.1 310.3,-381.6 310.3,-388.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(5) -->
+<g id="node2" class="node">
+<title>node_System(5)</title>
+<g id="a_node2"><a xlink:title="azalea_entity::plugin::indexing::update_entity_chunk_positions">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="244.38,-374.1 43.12,-374.1 43.12,-338.1 244.38,-338.1 244.38,-374.1"/>
+<text text-anchor="middle" x="143.75" y="-350.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">update_entity_chunk_positions</text>
+</a>
+</g>
+</g>
+<!-- node_System(6) -->
+<g id="node3" class="node">
+<title>node_System(6)</title>
+<g id="a_node3"><a xlink:title="azalea_entity::plugin::indexing::update_uuid_index">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="208.75,-327.1 78.75,-327.1 78.75,-291.1 208.75,-291.1 208.75,-327.1"/>
+<text text-anchor="middle" x="143.75" y="-303.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">update_uuid_index</text>
+</a>
+</g>
+</g>
+<!-- node_System(7) -->
+<g id="node4" class="node">
+<title>node_System(7)</title>
+<g id="a_node4"><a xlink:title="azalea_entity::plugin::indexing::update_entity_by_id_index">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="232,-280.1 55.5,-280.1 55.5,-244.1 232,-244.1 232,-280.1"/>
+<text text-anchor="middle" x="143.75" y="-256.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">update_entity_by_id_index</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26) -->
+<!-- node_System(38) -->
+<g id="node12" class="node">
+<title>node_System(38)</title>
+<g id="a_node12"><a xlink:title="azalea_client::mining::handle_start_mining_block_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1275.5,-273.1 1057.75,-273.1 1057.75,-237.1 1275.5,-237.1 1275.5,-273.1"/>
+<text text-anchor="middle" x="1166.62" y="-249.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_start_mining_block_event</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26)&#45;&gt;node_System(38) -->
+<g id="edge24" class="edge">
+<title>set_marker_node_Set(26)&#45;&gt;node_System(38)</title>
+<g id="a_edge24"><a xlink:title="InventorySet → handle_start_mining_block_event">
+<path fill="none" stroke="#881877" stroke-width="2" d="M922.99,-634.1C948.93,-623.37 991.26,-601.69 1012,-568.1 1077.87,-461.4 967.39,-379.36 1048.77,-280.5"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="1051.27,-282.69 1055.26,-272.88 1046.02,-278.06 1051.27,-282.69"/>
+</a>
+</g>
+</g>
+<!-- node_System(39) -->
+<g id="node13" class="node">
+<title>node_System(39)</title>
+<g id="a_node13"><a xlink:title="azalea_client::mining::handle_start_mining_block_with_direction_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1629,-273.1 1321.25,-273.1 1321.25,-237.1 1629,-237.1 1629,-273.1"/>
+<text text-anchor="middle" x="1475.12" y="-249.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_start_mining_block_with_direction_event</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26)&#45;&gt;node_System(39) -->
+<g id="edge32" class="edge">
+<title>set_marker_node_Set(26)&#45;&gt;node_System(39)</title>
+<g id="a_edge32"><a xlink:title="InventorySet → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M915.89,-634.1C941.8,-620.48 997.49,-593 1048,-580.1 1099.34,-566.98 1240.23,-584.05 1285.25,-556.1 1388.5,-491.99 1444.68,-348.32 1465.1,-285.49"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="1469.25,-285.95 1468.92,-275.36 1462.58,-283.85 1469.25,-285.95"/>
+</a>
+</g>
+</g>
+<!-- node_System(40) -->
+<g id="node14" class="node">
+<title>node_System(40)</title>
+<g id="a_node14"><a xlink:title="azalea_client::mining::handle_finish_mining_block_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1888,-273.1 1665,-273.1 1665,-237.1 1888,-237.1 1888,-273.1"/>
+<text text-anchor="middle" x="1776.5" y="-249.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_finish_mining_block_event</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26)&#45;&gt;node_System(40) -->
+<g id="edge41" class="edge">
+<title>set_marker_node_Set(26)&#45;&gt;node_System(40)</title>
+<g id="a_edge41"><a xlink:title="InventorySet → handle_finish_mining_block_event">
+<path fill="none" stroke="#663699" stroke-width="2" d="M977.34,-634.1C1000.05,-631.91 1025.02,-629.7 1048,-628.1 1080.23,-625.84 1603.84,-622.37 1629,-602.1 1677.68,-562.86 1642.35,-524.38 1665,-466.1 1691.32,-398.36 1733.58,-324.19 1757.49,-284.34"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="1760.95,-285.72 1763.14,-275.35 1754.97,-282.09 1760.95,-285.72"/>
+</a>
+</g>
+</g>
+<!-- node_System(41) -->
+<g id="node15" class="node">
+<title>node_System(41)</title>
+<g id="a_node15"><a xlink:title="azalea_client::mining::handle_stop_mining_block_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="2167.62,-273.1 1950.62,-273.1 1950.62,-237.1 2167.62,-237.1 2167.62,-273.1"/>
+<text text-anchor="middle" x="2059.12" y="-249.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_stop_mining_block_event</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26)&#45;&gt;node_System(41) -->
+<g id="edge50" class="edge">
+<title>set_marker_node_Set(26)&#45;&gt;node_System(41)</title>
+<g id="a_edge50"><a xlink:title="InventorySet → handle_stop_mining_block_event">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M1481.49,-634.1C1561.56,-630.89 1619.92,-626.39 1629,-620.1 1663.72,-596.01 1638.67,-565.15 1665,-532.1 1761.31,-411.19 1923.94,-320.28 2006.58,-279.22"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="2008.74,-282.08 2016.18,-274.53 2005.66,-275.79 2008.74,-282.08"/>
+</a>
+</g>
+</g>
+<!-- node_System(36) -->
+<g id="node44" class="node">
+<title>node_System(36)</title>
+<g id="a_node44"><a xlink:title="azalea_client::interact::update_modifiers_for_held_item">
+<polygon fill="lightgrey" stroke="black" points="1572.75,-596.1 1377.5,-596.1 1377.5,-560.1 1572.75,-560.1 1572.75,-596.1"/>
+<text text-anchor="middle" x="1475.12" y="-573.05" font-family="Times,serif" font-size="14.00">update_modifiers_for_held_item</text>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(26)&#45;&gt;node_System(36) -->
+<g id="edge21" class="edge">
+<title>set_marker_node_Set(26)&#45;&gt;node_System(36)</title>
+<g id="a_edge21"><a xlink:title="InventorySet → update_modifiers_for_held_item">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M926.8,-634.1C955.89,-625.4 1004.86,-611.84 1048,-605.1 1154.69,-588.42 1277.95,-581.98 1364.37,-579.53"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="1364.21,-582.95 1374.11,-579.19 1364.02,-575.95 1364.21,-582.95"/>
+</a>
+</g>
+</g>
+<!-- node_System(24) -->
+<g id="node6" class="node">
+<title>node_System(24)</title>
+<g id="a_node6"><a xlink:title="azalea_client::inventory::handle_menu_opened_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="995.88,-689.1 804.38,-689.1 804.38,-653.1 995.88,-653.1 995.88,-689.1"/>
+<text text-anchor="middle" x="900.12" y="-665.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_menu_opened_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(25) -->
+<g id="node7" class="node">
+<title>node_System(25)</title>
+<g id="a_node7"><a xlink:title="azalea_client::inventory::handle_set_container_content_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1285.25,-689.1 1048,-689.1 1048,-653.1 1285.25,-653.1 1285.25,-689.1"/>
+<text text-anchor="middle" x="1166.62" y="-665.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_set_container_content_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(24)&#45;&gt;node_System(25) -->
+<g id="edge5" class="edge">
+<title>node_System(24)&#45;&gt;node_System(25)</title>
+<g id="a_edge5"><a xlink:title="handle_menu_opened_event → handle_set_container_content_event">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M996.24,-671.1C1008.79,-671.1 1021.83,-671.1 1034.85,-671.1"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="1034.84,-674.6 1044.84,-671.1 1034.84,-667.6 1034.84,-674.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(26) -->
+<g id="node8" class="node">
+<title>node_System(26)</title>
+<g id="a_node8"><a xlink:title="azalea_client::inventory::handle_container_click_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1572,-689.1 1378.25,-689.1 1378.25,-653.1 1572,-653.1 1572,-689.1"/>
+<text text-anchor="middle" x="1475.12" y="-665.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_container_click_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(25)&#45;&gt;node_System(26) -->
+<g id="edge6" class="edge">
+<title>node_System(25)&#45;&gt;node_System(26)</title>
+<g id="a_edge6"><a xlink:title="handle_set_container_content_event → handle_container_click_event">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M1285.69,-671.1C1311.8,-671.1 1339.35,-671.1 1365.09,-671.1"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="1364.96,-674.6 1374.96,-671.1 1364.96,-667.6 1364.96,-674.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(27) -->
+<g id="node9" class="node">
+<title>node_System(27)</title>
+<g id="a_node9"><a xlink:title="azalea_client::inventory::handle_container_close_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="1876,-689.1 1677,-689.1 1677,-653.1 1876,-653.1 1876,-689.1"/>
+<text text-anchor="middle" x="1776.5" y="-665.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_container_close_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(26)&#45;&gt;node_System(27) -->
+<g id="edge8" class="edge">
+<title>node_System(26)&#45;&gt;node_System(27)</title>
+<g id="a_edge8"><a xlink:title="handle_container_click_event → handle_container_close_event">
+<path fill="none" stroke="#663699" stroke-width="2" d="M1572.5,-671.1C1601.66,-671.1 1633.93,-671.1 1664,-671.1"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="1663.74,-674.6 1673.74,-671.1 1663.74,-667.6 1663.74,-674.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(28) -->
+<g id="node10" class="node">
+<title>node_System(28)</title>
+<g id="a_node10"><a xlink:title="azalea_client::inventory::handle_client_side_close_container_event">
+<polygon fill="#eff1f3" stroke="#b4bec7" points="2194.25,-689.1 1924,-689.1 1924,-653.1 2194.25,-653.1 2194.25,-689.1"/>
+<text text-anchor="middle" x="2059.12" y="-665.67" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#15191d">handle_client_side_close_container_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(27)&#45;&gt;node_System(28) -->
+<g id="edge9" class="edge">
+<title>node_System(27)&#45;&gt;node_System(28)</title>
+<g id="a_edge9"><a xlink:title="handle_container_close_event → handle_client_side_close_container_event">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M1876.44,-671.1C1887.68,-671.1 1899.31,-671.1 1911,-671.1"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="1910.7,-674.6 1920.7,-671.1 1910.7,-667.6 1910.7,-674.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(4) -->
+<g id="node20" class="node">
+<title>node_System(4)</title>
+<g id="a_node20"><a xlink:title="azalea_client::local_player::handle_send_packet_event">
+<polygon fill="lightgrey" stroke="black" points="2583.25,-273.1 2421.75,-273.1 2421.75,-237.1 2583.25,-237.1 2583.25,-273.1"/>
+<text text-anchor="middle" x="2502.5" y="-250.05" font-family="Times,serif" font-size="14.00">handle_send_packet_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(27)&#45;&gt;node_System(4) -->
+<g id="edge7" class="edge">
+<title>node_System(27)&#45;&gt;node_System(4)</title>
+<g id="a_edge7"><a xlink:title="handle_container_close_event → SystemTypeSet(handle_send_packet_event&quot;)">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M1876.29,-654.77C1892.22,-652.38 1908.55,-650.06 1924,-648.1 1985.63,-640.27 2146.76,-649.02 2202.25,-621.1 2351.95,-545.75 2453.22,-357.76 2488.08,-284.75"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="2491.39,-285.81 2492.46,-275.27 2485.05,-282.84 2491.39,-285.81"/>
+</a>
+</g>
+</g>
+<!-- set_marker_node_Set(41) -->
+<!-- node_System(38)&#45;&gt;node_System(39) -->
+<g id="edge40" class="edge">
+<title>node_System(38)&#45;&gt;node_System(39)</title>
+<g id="a_edge40"><a xlink:title="handle_start_mining_block_event → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M1275.69,-255.1C1286.21,-255.1 1297.06,-255.1 1307.99,-255.1"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="1307.85,-258.6 1317.85,-255.1 1307.85,-251.6 1307.85,-258.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(14) -->
+<g id="node27" class="node">
+<title>node_System(14)</title>
+<g id="a_node27"><a xlink:title="azalea_entity::plugin::update_bounding_box">
+<polygon fill="lightgrey" stroke="black" points="2376.38,-412.1 2239.62,-412.1 2239.62,-376.1 2376.38,-376.1 2376.38,-412.1"/>
+<text text-anchor="middle" x="2308" y="-389.05" font-family="Times,serif" font-size="14.00">update_bounding_box</text>
+</a>
+</g>
+</g>
+<!-- node_System(38)&#45;&gt;node_System(14) -->
+<g id="edge25" class="edge">
+<title>node_System(38)&#45;&gt;node_System(14)</title>
+<g id="a_edge25"><a xlink:title="handle_start_mining_block_event → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M1275.92,-272.27C1279.19,-274.33 1282.32,-276.59 1285.25,-279.1 1319.91,-308.68 1291.03,-340.99 1321.25,-375.1 1423.49,-490.48 1509.35,-437.89 1629,-535.1 1648.61,-551.03 1642.17,-568.28 1665,-579.1 1754.56,-621.54 1790.92,-599.07 1888,-579.1 2036.89,-548.47 2063.8,-506.85 2202.25,-444.1 2220.44,-435.85 2240.25,-426.49 2257.7,-418.12"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="2259.86,-421 2267.35,-413.51 2256.82,-414.7 2259.86,-421"/>
+</a>
+</g>
+</g>
+<!-- node_System(15) -->
+<g id="node28" class="node">
+<title>node_System(15)</title>
+<g id="a_node28"><a xlink:title="azalea_physics::handle_force_jump">
+<polygon fill="lightgrey" stroke="black" points="2120,-438.1 1998.25,-438.1 1998.25,-402.1 2120,-402.1 2120,-438.1"/>
+<text text-anchor="middle" x="2059.12" y="-415.05" font-family="Times,serif" font-size="14.00">handle_force_jump</text>
+</a>
+</g>
+</g>
+<!-- node_System(38)&#45;&gt;node_System(15) -->
+<g id="edge31" class="edge">
+<title>node_System(38)&#45;&gt;node_System(15)</title>
+<g id="a_edge31"><a xlink:title="handle_start_mining_block_event → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M1275.75,-273C1279.05,-274.85 1282.23,-276.88 1285.25,-279.1 1311.87,-298.64 1293.7,-325.89 1321.25,-344.1 1375.85,-380.17 1809.49,-406.93 1984.88,-416.38"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="1984.63,-420.03 1994.81,-417.07 1985.01,-413.04 1984.63,-420.03"/>
+</a>
+</g>
+</g>
+<!-- node_System(35) -->
+<g id="node43" class="node">
+<title>node_System(35)</title>
+<g id="a_node43"><a xlink:title="azalea_client::interact::handle_swing_arm_event">
+<polygon fill="lightgrey" stroke="black" points="2385.75,-273.1 2230.25,-273.1 2230.25,-237.1 2385.75,-237.1 2385.75,-273.1"/>
+<text text-anchor="middle" x="2308" y="-250.05" font-family="Times,serif" font-size="14.00">handle_swing_arm_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(38)&#45;&gt;node_System(35) -->
+<g id="edge30" class="edge">
+<title>node_System(38)&#45;&gt;node_System(35)</title>
+<g id="a_edge30"><a xlink:title="handle_start_mining_block_event → SystemTypeSet(handle_swing_arm_event&quot;)">
+<path fill="none" stroke="#663699" stroke-width="2" d="M1275.7,-273.57C1290.96,-275.71 1306.47,-277.65 1321.25,-279.1 1711,-317.35 1817.13,-366.13 2202.25,-295.1 2220.58,-291.71 2239.86,-285.27 2256.8,-278.52"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="2258.79,-281.66 2266.68,-274.59 2256.11,-275.19 2258.79,-281.66"/>
+</a>
+</g>
+</g>
+<!-- node_System(39)&#45;&gt;node_System(40) -->
+<g id="edge49" class="edge">
+<title>node_System(39)&#45;&gt;node_System(40)</title>
+<g id="a_edge49"><a xlink:title="handle_start_mining_block_with_direction_event → handle_finish_mining_block_event">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M1629.32,-255.1C1636.88,-255.1 1644.42,-255.1 1651.88,-255.1"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="1651.75,-258.6 1661.75,-255.1 1651.75,-251.6 1651.75,-258.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(39)&#45;&gt;node_System(14) -->
+<g id="edge33" class="edge">
+<title>node_System(39)&#45;&gt;node_System(14)</title>
+<g id="a_edge33"><a xlink:title="handle_start_mining_block_with_direction_event → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M1561.94,-273.58C1594.17,-280.2 1631.19,-287.43 1665,-293.1 1763.63,-309.63 1789.78,-304.27 1888,-323.1 1904.2,-326.2 1907.85,-328.78 1924,-332.1 2027.91,-353.45 2148.91,-372 2226.66,-383.11"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="2226.84,-386.95 2237.23,-384.89 2227.82,-380.02 2226.84,-386.95"/>
+</a>
+</g>
+</g>
+<!-- node_System(39)&#45;&gt;node_System(15) -->
+<g id="edge39" class="edge">
+<title>node_System(39)&#45;&gt;node_System(15)</title>
+<g id="a_edge39"><a xlink:title="handle_start_mining_block_with_direction_event → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M1525.04,-273.54C1562.94,-287.51 1616.92,-306.67 1665,-321.1 1775.86,-354.35 1906.52,-385.74 1985.79,-403.93"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="1985.53,-407.92 1996.06,-406.73 1987.09,-401.09 1985.53,-407.92"/>
+</a>
+</g>
+</g>
+<!-- node_System(39)&#45;&gt;node_System(35) -->
+<g id="edge38" class="edge">
+<title>node_System(39)&#45;&gt;node_System(35)</title>
+<g id="a_edge38"><a xlink:title="handle_start_mining_block_with_direction_event → SystemTypeSet(handle_swing_arm_event&quot;)">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M1604.19,-273.58C1624.49,-275.88 1645.29,-277.85 1665,-279.1 1903.3,-294.18 1964.98,-305.93 2202.25,-279.1 2209.29,-278.3 2216.54,-277.21 2223.8,-275.94"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="2225.2,-278.85 2234.38,-273.55 2223.9,-271.97 2225.2,-278.85"/>
+</a>
+</g>
+</g>
+<!-- node_System(40)&#45;&gt;node_System(41) -->
+<g id="edge58" class="edge">
+<title>node_System(40)&#45;&gt;node_System(41)</title>
+<g id="a_edge58"><a xlink:title="handle_finish_mining_block_event → handle_stop_mining_block_event">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M1888.41,-255.1C1904.49,-255.1 1921.11,-255.1 1937.37,-255.1"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="1937.31,-258.6 1947.31,-255.1 1937.31,-251.6 1937.31,-258.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(40)&#45;&gt;node_System(14) -->
+<g id="edge42" class="edge">
+<title>node_System(40)&#45;&gt;node_System(14)</title>
+<g id="a_edge42"><a xlink:title="handle_finish_mining_block_event → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M1859.39,-273.51C1945.26,-293.24 2083.92,-326.31 2202.25,-360.1 2214.59,-363.62 2227.66,-367.63 2240.23,-371.64"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="2240,-375.88 2250.59,-375.62 2242.14,-369.22 2240,-375.88"/>
+</a>
+</g>
+</g>
+<!-- node_System(40)&#45;&gt;node_System(15) -->
+<g id="edge48" class="edge">
+<title>node_System(40)&#45;&gt;node_System(15)</title>
+<g id="a_edge48"><a xlink:title="handle_finish_mining_block_event → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M1805.78,-273.52C1828.18,-288.17 1860.21,-309.27 1888,-328.1 1904.13,-339.02 1907.24,-343.16 1924,-353.1 1950.29,-368.68 1980.67,-384.06 2005.87,-396.15"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="2004.88,-399.5 2015.41,-400.63 2007.88,-393.18 2004.88,-399.5"/>
+</a>
+</g>
+</g>
+<!-- node_System(40)&#45;&gt;node_System(35) -->
+<g id="edge47" class="edge">
+<title>node_System(40)&#45;&gt;node_System(35)</title>
+<g id="a_edge47"><a xlink:title="handle_finish_mining_block_event → SystemTypeSet(handle_swing_arm_event&quot;)">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M1882.1,-236.65C1896.15,-234.76 1910.4,-233.16 1924,-232.1 2047.29,-222.48 2079.3,-218.76 2202.25,-232.1 2207.87,-232.71 2213.63,-233.49 2219.41,-234.41"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="2219.63,-238.35 2230.08,-236.6 2220.82,-231.45 2219.63,-238.35"/>
+</a>
+</g>
+</g>
+<!-- node_System(41)&#45;&gt;node_System(14) -->
+<g id="edge51" class="edge">
+<title>node_System(41)&#45;&gt;node_System(14)</title>
+<g id="a_edge51"><a xlink:title="handle_stop_mining_block_event → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M2092.91,-273.55C2136.74,-298.23 2214.57,-342.06 2263.34,-369.51"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="2262.04,-372.93 2272.47,-374.78 2265.48,-366.83 2262.04,-372.93"/>
+</a>
+</g>
+</g>
+<!-- node_System(41)&#45;&gt;node_System(15) -->
+<g id="edge57" class="edge">
+<title>node_System(41)&#45;&gt;node_System(15)</title>
+<g id="a_edge57"><a xlink:title="handle_stop_mining_block_event → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#881877" stroke-width="2" d="M2059.12,-273.46C2059.12,-311.97 2059.12,-350.48 2059.12,-388.99"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="2055.63,-388.77 2059.12,-398.77 2062.63,-388.77 2055.63,-388.77"/>
+</a>
+</g>
+</g>
+<!-- node_System(41)&#45;&gt;node_System(35) -->
+<g id="edge56" class="edge">
+<title>node_System(41)&#45;&gt;node_System(35)</title>
+<g id="a_edge56"><a xlink:title="handle_stop_mining_block_event → SystemTypeSet(handle_swing_arm_event&quot;)">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M2168.05,-255.1C2184.53,-255.1 2201.39,-255.1 2217.42,-255.1"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="2217.08,-258.6 2227.08,-255.1 2217.08,-251.6 2217.08,-258.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(0) -->
+<g id="node16" class="node">
+<title>node_System(0)</title>
+<g id="a_node16"><a xlink:title="azalea_client::packet_handling::death_event_on_0_health">
+<polygon fill="lightgrey" stroke="black" points="221.12,-632.1 66.38,-632.1 66.38,-596.1 221.12,-596.1 221.12,-632.1"/>
+<text text-anchor="middle" x="143.75" y="-609.05" font-family="Times,serif" font-size="14.00">death_event_on_0_health</text>
+</a>
+</g>
+</g>
+<!-- node_System(22) -->
+<g id="node35" class="node">
+<title>node_System(22)</title>
+<g id="a_node35"><a xlink:title="azalea_client::events::death_listener">
+<polygon fill="lightgrey" stroke="black" points="498.12,-620.1 406.38,-620.1 406.38,-584.1 498.12,-584.1 498.12,-620.1"/>
+<text text-anchor="middle" x="452.25" y="-597.05" font-family="Times,serif" font-size="14.00">death_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(0)&#45;&gt;node_System(22) -->
+<g id="edge1" class="edge">
+<title>node_System(0)&#45;&gt;node_System(22)</title>
+<g id="a_edge1"><a xlink:title="death_event_on_0_health → SystemTypeSet(death_listener&quot;)">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M221.3,-611.1C274.58,-609.01 344.51,-606.27 393.21,-604.37"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="393.18,-607.75 403.04,-603.87 392.91,-600.76 393.18,-607.75"/>
+</a>
+</g>
+</g>
+<!-- node_System(51) -->
+<g id="node55" class="node">
+<title>node_System(51)</title>
+<g id="a_node55"><a xlink:title="azalea::auto_respawn::auto_respawn">
+<polygon fill="lightgrey" stroke="black" points="497.75,-667.1 406.75,-667.1 406.75,-631.1 497.75,-631.1 497.75,-667.1"/>
+<text text-anchor="middle" x="452.25" y="-644.05" font-family="Times,serif" font-size="14.00">auto_respawn</text>
+</a>
+</g>
+</g>
+<!-- node_System(0)&#45;&gt;node_System(51) -->
+<g id="edge70" class="edge">
+<title>node_System(0)&#45;&gt;node_System(51)</title>
+<g id="a_edge70"><a xlink:title="SystemTypeSet(death_event_on_0_health&quot;) → auto_respawn">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M221.3,-622.84C274.74,-628.94 344.94,-636.96 393.65,-642.52"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="393.15,-646.33 403.48,-643.98 393.94,-639.37 393.15,-646.33"/>
+</a>
+</g>
+</g>
+<!-- node_System(1) -->
+<g id="node17" class="node">
+<title>node_System(1)</title>
+<g id="a_node17"><a xlink:title="azalea_client::local_player::update_in_loaded_chunk">
+<polygon fill="lightgrey" stroke="black" points="219.62,-679.1 67.88,-679.1 67.88,-643.1 219.62,-643.1 219.62,-679.1"/>
+<text text-anchor="middle" x="143.75" y="-656.05" font-family="Times,serif" font-size="14.00">update_in_loaded_chunk</text>
+</a>
+</g>
+</g>
+<!-- node_System(2) -->
+<g id="node18" class="node">
+<title>node_System(2)</title>
+<g id="a_node18"><a xlink:title="azalea_client::local_player::death_event">
+<polygon fill="lightgrey" stroke="black" points="184.38,-726.1 103.12,-726.1 103.12,-690.1 184.38,-690.1 184.38,-726.1"/>
+<text text-anchor="middle" x="143.75" y="-703.05" font-family="Times,serif" font-size="14.00">death_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(30) -->
+<g id="node38" class="node">
+<title>node_System(30)</title>
+<g id="a_node38"><a xlink:title="azalea_client::chat::handle_send_chat_kind_event">
+<polygon fill="lightgrey" stroke="black" points="2798.75,-249.1 2619.25,-249.1 2619.25,-213.1 2798.75,-213.1 2798.75,-249.1"/>
+<text text-anchor="middle" x="2709" y="-226.05" font-family="Times,serif" font-size="14.00">handle_send_chat_kind_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(4)&#45;&gt;node_System(30) -->
+<g id="edge10" class="edge">
+<title>node_System(4)&#45;&gt;node_System(30)</title>
+<g id="a_edge10"><a xlink:title="SystemTypeSet(handle_send_packet_event&quot;) → handle_send_chat_kind_event">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M2583.74,-245.68C2591.12,-244.81 2598.66,-243.93 2606.21,-243.04"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="2606.34,-246.2 2615.86,-241.56 2605.52,-239.25 2606.34,-246.2"/>
+</a>
+</g>
+</g>
+<!-- node_System(8) -->
+<g id="node21" class="node">
+<title>node_System(8)</title>
+<g id="a_node21"><a xlink:title="azalea_entity::plugin::relative_updates::add_updates_received">
+<polygon fill="lightgrey" stroke="black" points="211.75,-773.1 75.75,-773.1 75.75,-737.1 211.75,-737.1 211.75,-773.1"/>
+<text text-anchor="middle" x="143.75" y="-750.05" font-family="Times,serif" font-size="14.00">add_updates_received</text>
+</a>
+</g>
+</g>
+<!-- node_System(9) -->
+<g id="node22" class="node">
+<title>node_System(9)</title>
+<g id="a_node22"><a xlink:title="azalea_entity::plugin::relative_updates::debug_detect_updates_received_on_local_entities">
+<polygon fill="lightgrey" stroke="black" points="287.5,-820.1 0,-820.1 0,-784.1 287.5,-784.1 287.5,-820.1"/>
+<text text-anchor="middle" x="143.75" y="-797.05" font-family="Times,serif" font-size="14.00">debug_detect_updates_received_on_local_entities</text>
+</a>
+</g>
+</g>
+<!-- node_System(10) -->
+<g id="node23" class="node">
+<title>node_System(10)</title>
+<g id="a_node23"><a xlink:title="azalea_entity::plugin::debug_new_entity">
+<polygon fill="lightgrey" stroke="black" points="201.62,-867.1 85.88,-867.1 85.88,-831.1 201.62,-831.1 201.62,-867.1"/>
+<text text-anchor="middle" x="143.75" y="-844.05" font-family="Times,serif" font-size="14.00">debug_new_entity</text>
+</a>
+</g>
+</g>
+<!-- node_System(11) -->
+<g id="node24" class="node">
+<title>node_System(11)</title>
+<g id="a_node24"><a xlink:title="azalea_entity::plugin::add_dead">
+<polygon fill="lightgrey" stroke="black" points="177.62,-914.1 109.88,-914.1 109.88,-878.1 177.62,-878.1 177.62,-914.1"/>
+<text text-anchor="middle" x="143.75" y="-891.05" font-family="Times,serif" font-size="14.00">add_dead</text>
+</a>
+</g>
+</g>
+<!-- node_System(12) -->
+<g id="node25" class="node">
+<title>node_System(12)</title>
+<g id="a_node25"><a xlink:title="azalea_entity::plugin::clamp_look_direction">
+<polygon fill="lightgrey" stroke="black" points="752.25,-434.1 617,-434.1 617,-398.1 752.25,-398.1 752.25,-434.1"/>
+<text text-anchor="middle" x="684.62" y="-411.05" font-family="Times,serif" font-size="14.00">clamp_look_direction</text>
+</a>
+</g>
+</g>
+<!-- node_System(12)&#45;&gt;node_System(15) -->
+<g id="edge3" class="edge">
+<title>node_System(12)&#45;&gt;node_System(15)</title>
+<g id="a_edge3"><a xlink:title="SystemTypeSet(clamp_look_direction&quot;) → handle_force_jump">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M752.7,-416.82C764.54,-416.93 776.76,-417.03 788.25,-417.1 1243.51,-419.85 1790.6,-420.11 1985.13,-420.11"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="1984.97,-423.61 1994.97,-420.11 1984.97,-416.61 1984.97,-423.61"/>
+</a>
+</g>
+</g>
+<!-- node_System(33) -->
+<g id="node41" class="node">
+<title>node_System(33)</title>
+<g id="a_node41"><a xlink:title="azalea_client::interact::update_hit_result_component">
+<polygon fill="lightgrey" stroke="black" points="988.75,-123.1 811.5,-123.1 811.5,-87.1 988.75,-87.1 988.75,-123.1"/>
+<text text-anchor="middle" x="900.12" y="-100.05" font-family="Times,serif" font-size="14.00">update_hit_result_component</text>
+</a>
+</g>
+</g>
+<!-- node_System(12)&#45;&gt;node_System(33) -->
+<g id="edge15" class="edge">
+<title>node_System(12)&#45;&gt;node_System(33)</title>
+<g id="a_edge15"><a xlink:title="SystemTypeSet(clamp_look_direction&quot;) → update_hit_result_component">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M687.66,-397.94C693.88,-350.74 716.78,-222.82 788.25,-150.1 796.63,-141.57 806.84,-134.61 817.63,-128.93"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="819.53,-131.95 827.04,-124.47 816.51,-125.63 819.53,-131.95"/>
+</a>
+</g>
+</g>
+<!-- node_System(13) -->
+<g id="node26" class="node">
+<title>node_System(13)</title>
+<g id="a_node26"><a xlink:title="azalea_entity::plugin::update_fluid_on_eyes">
+<polygon fill="lightgrey" stroke="black" points="967.75,-192.1 832.5,-192.1 832.5,-156.1 967.75,-156.1 967.75,-192.1"/>
+<text text-anchor="middle" x="900.12" y="-169.05" font-family="Times,serif" font-size="14.00">update_fluid_on_eyes</text>
+</a>
+</g>
+</g>
+<!-- node_System(13)&#45;&gt;node_System(38) -->
+<g id="edge26" class="edge">
+<title>node_System(13)&#45;&gt;node_System(38)</title>
+<g id="a_edge26"><a xlink:title="SystemTypeSet(update_fluid_on_eyes&quot;) → handle_start_mining_block_event">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M961.48,-192.58C1000.66,-204.58 1051.95,-220.28 1093.32,-232.95"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="1092.95,-237.11 1103.53,-236.69 1095,-230.42 1092.95,-237.11"/>
+</a>
+</g>
+</g>
+<!-- node_System(13)&#45;&gt;node_System(39) -->
+<g id="edge34" class="edge">
+<title>node_System(13)&#45;&gt;node_System(39)</title>
+<g id="a_edge34"><a xlink:title="SystemTypeSet(update_fluid_on_eyes&quot;) → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M968.07,-178.17C1044.98,-183.43 1174.79,-194.13 1285.25,-212.1 1319.98,-217.74 1357.87,-225.96 1390.54,-233.7"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="1390.25,-237.71 1400.79,-236.63 1391.88,-230.9 1390.25,-237.71"/>
+</a>
+</g>
+</g>
+<!-- node_System(13)&#45;&gt;node_System(40) -->
+<g id="edge43" class="edge">
+<title>node_System(13)&#45;&gt;node_System(40)</title>
+<g id="a_edge43"><a xlink:title="SystemTypeSet(update_fluid_on_eyes&quot;) → handle_finish_mining_block_event">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M968.22,-172.99C1044.98,-172.3 1174.4,-172.92 1285.25,-182.1 1439.11,-194.84 1476.35,-209.01 1629,-232.1 1636.51,-233.23 1644.24,-234.41 1652.03,-235.61"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="1652.32,-239.5 1662.73,-237.57 1653.38,-232.59 1652.32,-239.5"/>
+</a>
+</g>
+</g>
+<!-- node_System(13)&#45;&gt;node_System(41) -->
+<g id="edge52" class="edge">
+<title>node_System(13)&#45;&gt;node_System(41)</title>
+<g id="a_edge52"><a xlink:title="SystemTypeSet(update_fluid_on_eyes&quot;) → handle_stop_mining_block_event">
+<path fill="none" stroke="#663699" stroke-width="2" d="M968.02,-171.89C993.1,-171.16 1021.86,-170.45 1048,-170.1 1306.26,-166.58 1372.06,-156.79 1629,-183.1 1741.52,-194.61 1869.21,-217.29 1955.84,-234.13"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="1956.09,-238.14 1966.58,-236.62 1957.44,-231.27 1956.09,-238.14"/>
+</a>
+</g>
+</g>
+<!-- node_System(15)&#45;&gt;node_System(14) -->
+<g id="edge4" class="edge">
+<title>node_System(15)&#45;&gt;node_System(14)</title>
+<g id="a_edge4"><a xlink:title="handle_force_jump → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M2120.2,-413.77C2152.23,-410.4 2192.08,-406.2 2226.73,-402.55"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="2226.66,-405.76 2236.24,-401.23 2225.93,-398.8 2226.66,-405.76"/>
+</a>
+</g>
+</g>
+<!-- node_System(16) -->
+<g id="node29" class="node">
+<title>node_System(16)</title>
+<g id="a_node29"><a xlink:title="azalea_client::events::chat_listener">
+<polygon fill="lightgrey" stroke="black" points="186.25,-961.1 101.25,-961.1 101.25,-925.1 186.25,-925.1 186.25,-961.1"/>
+<text text-anchor="middle" x="143.75" y="-938.05" font-family="Times,serif" font-size="14.00">chat_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(17) -->
+<g id="node30" class="node">
+<title>node_System(17)</title>
+<g id="a_node30"><a xlink:title="azalea_client::events::login_listener">
+<polygon fill="lightgrey" stroke="black" points="188.88,-1008.1 98.62,-1008.1 98.62,-972.1 188.88,-972.1 188.88,-1008.1"/>
+<text text-anchor="middle" x="143.75" y="-985.05" font-family="Times,serif" font-size="14.00">login_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(18) -->
+<g id="node31" class="node">
+<title>node_System(18)</title>
+<g id="a_node31"><a xlink:title="azalea_client::events::packet_listener">
+<polygon fill="lightgrey" stroke="black" points="192.62,-1055.1 94.88,-1055.1 94.88,-1019.1 192.62,-1019.1 192.62,-1055.1"/>
+<text text-anchor="middle" x="143.75" y="-1032.05" font-family="Times,serif" font-size="14.00">packet_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(19) -->
+<g id="node32" class="node">
+<title>node_System(19)</title>
+<g id="a_node32"><a xlink:title="azalea_client::events::add_player_listener">
+<polygon fill="lightgrey" stroke="black" points="205,-1102.1 82.5,-1102.1 82.5,-1066.1 205,-1066.1 205,-1102.1"/>
+<text text-anchor="middle" x="143.75" y="-1079.05" font-family="Times,serif" font-size="14.00">add_player_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(20) -->
+<g id="node33" class="node">
+<title>node_System(20)</title>
+<g id="a_node33"><a xlink:title="azalea_client::events::update_player_listener">
+<polygon fill="lightgrey" stroke="black" points="213.25,-1149.1 74.25,-1149.1 74.25,-1113.1 213.25,-1113.1 213.25,-1149.1"/>
+<text text-anchor="middle" x="143.75" y="-1126.05" font-family="Times,serif" font-size="14.00">update_player_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(21) -->
+<g id="node34" class="node">
+<title>node_System(21)</title>
+<g id="a_node34"><a xlink:title="azalea_client::events::remove_player_listener">
+<polygon fill="lightgrey" stroke="black" points="215.88,-1196.1 71.62,-1196.1 71.62,-1160.1 215.88,-1160.1 215.88,-1196.1"/>
+<text text-anchor="middle" x="143.75" y="-1173.05" font-family="Times,serif" font-size="14.00">remove_player_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(23) -->
+<g id="node36" class="node">
+<title>node_System(23)</title>
+<g id="a_node36"><a xlink:title="azalea_client::events::keepalive_listener">
+<polygon fill="lightgrey" stroke="black" points="200.88,-1243.1 86.62,-1243.1 86.62,-1207.1 200.88,-1207.1 200.88,-1243.1"/>
+<text text-anchor="middle" x="143.75" y="-1220.05" font-family="Times,serif" font-size="14.00">keepalive_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(29) -->
+<g id="node37" class="node">
+<title>node_System(29)</title>
+<g id="a_node37"><a xlink:title="azalea_client::chat::handle_send_chat_event">
+<polygon fill="lightgrey" stroke="black" points="2576.88,-226.1 2428.12,-226.1 2428.12,-190.1 2576.88,-190.1 2576.88,-226.1"/>
+<text text-anchor="middle" x="2502.5" y="-203.05" font-family="Times,serif" font-size="14.00">handle_send_chat_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(29)&#45;&gt;node_System(30) -->
+<g id="edge11" class="edge">
+<title>node_System(29)&#45;&gt;node_System(30)</title>
+<g id="a_edge11"><a xlink:title="handle_send_chat_event → handle_send_chat_kind_event">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M2577.33,-216.4C2586.72,-217.46 2596.45,-218.55 2606.18,-219.64"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="2605.61,-223.44 2615.94,-221.08 2606.39,-216.48 2605.61,-223.44"/>
+</a>
+</g>
+</g>
+<!-- node_System(31) -->
+<g id="node39" class="node">
+<title>node_System(31)</title>
+<g id="a_node39"><a xlink:title="azalea_client::movement::sprint_listener">
+<polygon fill="lightgrey" stroke="black" points="946.75,-515.1 853.5,-515.1 853.5,-479.1 946.75,-479.1 946.75,-515.1"/>
+<text text-anchor="middle" x="900.12" y="-492.05" font-family="Times,serif" font-size="14.00">sprint_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(31)&#45;&gt;node_System(15) -->
+<g id="edge12" class="edge">
+<title>node_System(31)&#45;&gt;node_System(15)</title>
+<g id="a_edge12"><a xlink:title="sprint_listener → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M947.25,-499.17C1088.84,-504.71 1529.4,-515.85 1888,-459.1 1920.21,-454 1955.41,-446.29 1985.39,-439.08"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="1987.01,-441.79 1995.89,-436.02 1985.34,-434.99 1987.01,-441.79"/>
+</a>
+</g>
+</g>
+<!-- node_System(32) -->
+<g id="node40" class="node">
+<title>node_System(32)</title>
+<g id="a_node40"><a xlink:title="azalea_client::movement::walk_listener">
+<polygon fill="lightgrey" stroke="black" points="1211,-550.1 1122.25,-550.1 1122.25,-514.1 1211,-514.1 1211,-550.1"/>
+<text text-anchor="middle" x="1166.62" y="-527.05" font-family="Times,serif" font-size="14.00">walk_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(31)&#45;&gt;node_System(32) -->
+<g id="edge14" class="edge">
+<title>node_System(31)&#45;&gt;node_System(32)</title>
+<g id="a_edge14"><a xlink:title="sprint_listener → walk_listener">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M947.2,-503.19C992.21,-509.15 1060.81,-518.23 1109.1,-524.62"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="1108.46,-528.46 1118.84,-526.3 1109.38,-521.52 1108.46,-528.46"/>
+</a>
+</g>
+</g>
+<!-- node_System(32)&#45;&gt;node_System(15) -->
+<g id="edge13" class="edge">
+<title>node_System(32)&#45;&gt;node_System(15)</title>
+<g id="a_edge13"><a xlink:title="walk_listener → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#881877" stroke-width="2" d="M1211.32,-532.87C1346.89,-534.89 1759.02,-538.09 1888,-505.1 1936.28,-492.75 1986.77,-465.41 2020.08,-445.05"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="2022.05,-447.71 2028.69,-439.45 2018.35,-441.76 2022.05,-447.71"/>
+</a>
+</g>
+</g>
+<!-- node_System(32)&#45;&gt;node_System(36) -->
+<g id="edge22" class="edge">
+<title>node_System(32)&#45;&gt;node_System(36)</title>
+<g id="a_edge22"><a xlink:title="SystemTypeSet(walk_listener&quot;) → update_modifiers_for_held_item">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M1211.21,-538.64C1251.07,-544.62 1311.71,-553.72 1364.71,-561.68"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="1364.89,-565.54 1375.3,-563.56 1365.93,-558.62 1364.89,-565.54"/>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(38) -->
+<g id="edge27" class="edge">
+<title>node_System(33)&#45;&gt;node_System(38)</title>
+<g id="a_edge27"><a xlink:title="SystemTypeSet(update_hit_result_component&quot;) → handle_start_mining_block_event">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M957.07,-123.52C975.24,-130.61 995.06,-139.57 1012,-150.1 1030.18,-161.4 1030.84,-169.29 1048,-182.1 1071.4,-199.56 1099.08,-216.88 1121.7,-230.27"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="1120.3,-233.67 1130.7,-235.7 1123.83,-227.63 1120.3,-233.67"/>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(39) -->
+<g id="edge35" class="edge">
+<title>node_System(33)&#45;&gt;node_System(39)</title>
+<g id="a_edge35"><a xlink:title="SystemTypeSet(update_hit_result_component&quot;) → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#881877" stroke-width="2" d="M989.03,-119.13C1067.51,-132.62 1185.17,-155.19 1285.25,-184.1 1331.26,-197.39 1381.99,-216.73 1419.28,-231.87"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="1418.31,-235.07 1428.89,-235.62 1420.96,-228.6 1418.31,-235.07"/>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(40) -->
+<g id="edge44" class="edge">
+<title>node_System(33)&#45;&gt;node_System(40)</title>
+<g id="a_edge44"><a xlink:title="SystemTypeSet(update_hit_result_component&quot;) → handle_finish_mining_block_event">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M988.9,-114.23C1179.15,-134.07 1613.75,-179.71 1629,-184.1 1666.25,-194.79 1705.62,-214.4 1734.16,-230.3"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="1732.88,-233.74 1743.3,-235.63 1736.33,-227.65 1732.88,-233.74"/>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(41) -->
+<g id="edge53" class="edge">
+<title>node_System(33)&#45;&gt;node_System(41)</title>
+<g id="a_edge53"><a xlink:title="SystemTypeSet(update_hit_result_component&quot;) → handle_stop_mining_block_event">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M935.88,-86.72C964.93,-72.45 1007.93,-53.84 1048,-46.1 1231.89,-10.54 1715.91,-41.17 1888,-115.1 1947.88,-140.82 2003.41,-194.31 2033.86,-227.22"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="2031.16,-229.67 2040.48,-234.72 2036.35,-224.96 2031.16,-229.67"/>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(4) -->
+<g id="edge16" class="edge">
+<title>node_System(33)&#45;&gt;node_System(4)</title>
+<g id="a_edge16"><a xlink:title="update_hit_result_component → SystemTypeSet(handle_send_packet_event&quot;)">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M928.4,-86.73C956.87,-68.66 1003.49,-42.08 1048,-30.1 1231.14,19.22 1284.46,-7.1 1474.12,-7.1 1474.12,-7.1 1474.12,-7.1 2060.12,-7.1 2211.65,-7.1 2281.22,1.6 2385.75,-108.1 2422.48,-146.64 2387.09,-185.5 2418.36,-226.92"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="2415.71,-229.47 2424.95,-234.65 2420.95,-224.84 2415.71,-229.47"/>
+</a>
+</g>
+</g>
+<!-- node_System(34) -->
+<g id="node42" class="node">
+<title>node_System(34)</title>
+<g id="a_node42"><a xlink:title="azalea_client::interact::handle_block_interact_event">
+<polygon fill="lightgrey" stroke="black" points="1252.62,-88.1 1080.62,-88.1 1080.62,-52.1 1252.62,-52.1 1252.62,-88.1"/>
+<text text-anchor="middle" x="1166.62" y="-65.05" font-family="Times,serif" font-size="14.00">handle_block_interact_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(33)&#45;&gt;node_System(34) -->
+<g id="edge18" class="edge">
+<title>node_System(33)&#45;&gt;node_System(34)</title>
+<g id="a_edge18"><a xlink:title="update_hit_result_component → handle_block_interact_event">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M989.2,-93.44C1014.27,-90.12 1041.73,-86.49 1067.36,-83.1"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="1067.73,-86.18 1077.18,-81.4 1066.81,-79.24 1067.73,-86.18"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(38) -->
+<g id="edge29" class="edge">
+<title>node_System(34)&#45;&gt;node_System(38)</title>
+<g id="a_edge29"><a xlink:title="SystemTypeSet(handle_block_interact_event&quot;) → handle_start_mining_block_event">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M1166.62,-88.52C1166.62,-133.72 1166.62,-178.93 1166.62,-224.13"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="1163.13,-223.88 1166.62,-233.88 1170.13,-223.88 1163.13,-223.88"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(39) -->
+<g id="edge37" class="edge">
+<title>node_System(34)&#45;&gt;node_System(39)</title>
+<g id="a_edge37"><a xlink:title="SystemTypeSet(handle_block_interact_event&quot;) → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M1198.13,-88.51C1253.44,-121.89 1370.3,-192.43 1432.74,-230.12"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="1431.37,-233.58 1441.74,-235.76 1434.99,-227.59 1431.37,-233.58"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(40) -->
+<g id="edge46" class="edge">
+<title>node_System(34)&#45;&gt;node_System(40)</title>
+<g id="a_edge46"><a xlink:title="SystemTypeSet(handle_block_interact_event&quot;) → handle_finish_mining_block_event">
+<path fill="none" stroke="#881877" stroke-width="2" d="M1252.97,-87.64C1263.92,-90.49 1274.91,-93.65 1285.25,-97.1 1301.86,-102.64 1304.49,-108.02 1321.25,-113.1 1454.07,-153.37 1499.02,-117.43 1629,-166.1 1670.27,-181.55 1712.81,-208.9 1741.35,-229.22"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="1739.42,-232.59 1749.57,-235.62 1743.52,-226.92 1739.42,-232.59"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(41) -->
+<g id="edge55" class="edge">
+<title>node_System(34)&#45;&gt;node_System(41)</title>
+<g id="a_edge55"><a xlink:title="SystemTypeSet(handle_block_interact_event&quot;) → handle_stop_mining_block_event">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M1252.93,-77.89C1442.87,-95.26 1884.3,-135.75 1888,-137.1 1943.46,-157.31 1997.78,-200.15 2029.59,-228.27"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="2027.33,-230.74 2037.1,-234.83 2032.01,-225.54 2027.33,-230.74"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(4) -->
+<g id="edge17" class="edge">
+<title>node_System(34)&#45;&gt;node_System(4)</title>
+<g id="a_edge17"><a xlink:title="handle_block_interact_event → SystemTypeSet(handle_send_packet_event&quot;)">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M1252.67,-66.22C1370.2,-61.2 1588.9,-53.1 1775.5,-53.1 1775.5,-53.1 1775.5,-53.1 2060.12,-53.1 2239.46,-53.1 2254.61,-167.1 2421.75,-232.1 2421.88,-232.14 2422,-232.19 2422.13,-232.24"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="2421.61,-235.5 2432.2,-235.63 2424,-228.93 2421.61,-235.5"/>
+</a>
+</g>
+</g>
+<!-- node_System(34)&#45;&gt;node_System(35) -->
+<g id="edge20" class="edge">
+<title>node_System(34)&#45;&gt;node_System(35)</title>
+<g id="a_edge20"><a xlink:title="handle_block_interact_event → handle_swing_arm_event">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M1253.09,-66.99C1389.2,-63.93 1662.84,-65.46 1888,-115.1 2021.04,-144.43 2171.19,-200.46 2250.65,-232.01"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="2249.73,-235.22 2260.31,-235.67 2252.32,-228.71 2249.73,-235.22"/>
+</a>
+</g>
+</g>
+<!-- node_System(35)&#45;&gt;node_System(4) -->
+<g id="edge19" class="edge">
+<title>node_System(35)&#45;&gt;node_System(4)</title>
+<g id="a_edge19"><a xlink:title="handle_swing_arm_event → SystemTypeSet(handle_send_packet_event&quot;)">
+<path fill="none" stroke="#663699" stroke-width="2" d="M2386.19,-255.1C2393.54,-255.1 2401.04,-255.1 2408.51,-255.1"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="2408.46,-258.6 2418.46,-255.1 2408.46,-251.6 2408.46,-258.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(37) -->
+<g id="node45" class="node">
+<title>node_System(37)</title>
+<g id="a_node45"><a xlink:title="azalea_client::respawn::perform_respawn">
+<polygon fill="lightgrey" stroke="black" points="740.62,-667.1 628.62,-667.1 628.62,-631.1 740.62,-631.1 740.62,-667.1"/>
+<text text-anchor="middle" x="684.62" y="-644.05" font-family="Times,serif" font-size="14.00">perform_respawn</text>
+</a>
+</g>
+</g>
+<!-- node_System(37)&#45;&gt;node_System(4) -->
+<g id="edge23" class="edge">
+<title>node_System(37)&#45;&gt;node_System(4)</title>
+<g id="a_edge23"><a xlink:title="perform_respawn → SystemTypeSet(handle_send_packet_event&quot;)">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M703.7,-667.39C722.81,-685.37 754.77,-711.69 788.25,-723.1 947.1,-777.2 997.82,-735.1 1165.62,-735.1 1165.62,-735.1 1165.62,-735.1 2060.12,-735.1 2123.52,-735.1 2144.81,-749.92 2202.25,-723.1 2307.18,-674.1 2321.82,-634.66 2385.75,-538.1 2441.13,-454.45 2477.82,-340.07 2493.24,-285.93"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="2497.39,-286.08 2496.7,-275.51 2490.64,-284.21 2497.39,-286.08"/>
+</a>
+</g>
+</g>
+<!-- node_System(42) -->
+<g id="node46" class="node">
+<title>node_System(42)</title>
+<g id="a_node46"><a xlink:title="azalea_client::attack::handle_attack_event">
+<polygon fill="lightgrey" stroke="black" points="963.62,-411.1 836.62,-411.1 836.62,-375.1 963.62,-375.1 963.62,-411.1"/>
+<text text-anchor="middle" x="900.12" y="-388.05" font-family="Times,serif" font-size="14.00">handle_attack_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(37)&#45;&gt;node_System(42) -->
+<g id="edge61" class="edge">
+<title>node_System(37)&#45;&gt;node_System(42)</title>
+<g id="a_edge61"><a xlink:title="SystemTypeSet(perform_respawn&quot;) → handle_attack_event">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M703.66,-630.76C718.27,-615.14 738.6,-591.54 752.25,-568.1 774.75,-529.43 761.08,-509.63 788.25,-474.1 805.59,-451.42 830.97,-432.23 853.08,-418.23"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="855.24,-420.79 861.95,-412.59 851.59,-414.82 855.24,-420.79"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(38) -->
+<g id="edge28" class="edge">
+<title>node_System(42)&#45;&gt;node_System(38)</title>
+<g id="a_edge28"><a xlink:title="SystemTypeSet(handle_attack_event&quot;) → handle_start_mining_block_event">
+<path fill="none" stroke="#0090cc" stroke-width="2" d="M918.74,-374.91C944.61,-349.34 995.5,-303.22 1048,-279.1 1048.54,-278.85 1049.09,-278.6 1049.64,-278.35"/>
+<polygon fill="#0090cc" stroke="#0090cc" stroke-width="2" points="1051.53,-281.56 1059.5,-274.58 1048.92,-275.07 1051.53,-281.56"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(39) -->
+<g id="edge36" class="edge">
+<title>node_System(42)&#45;&gt;node_System(39)</title>
+<g id="a_edge36"><a xlink:title="SystemTypeSet(handle_attack_event&quot;) → handle_start_mining_block_with_direction_event">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M910.83,-374.83C930.87,-339.31 980.68,-261.81 1048,-232.1 1098.8,-209.67 1236.22,-221.4 1341.4,-234.97"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="1340.69,-238.8 1351.06,-236.63 1341.6,-231.86 1340.69,-238.8"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(40) -->
+<g id="edge45" class="edge">
+<title>node_System(42)&#45;&gt;node_System(40)</title>
+<g id="a_edge45"><a xlink:title="SystemTypeSet(handle_attack_event&quot;) → handle_finish_mining_block_event">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M963.95,-383.41C1090.06,-363.93 1383.04,-318.5 1629,-279.1 1636.51,-277.89 1644.23,-276.65 1652.02,-275.39"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="1653.41,-278.38 1662.73,-273.33 1652.29,-271.47 1653.41,-278.38"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(41) -->
+<g id="edge54" class="edge">
+<title>node_System(42)&#45;&gt;node_System(41)</title>
+<g id="a_edge54"><a xlink:title="SystemTypeSet(handle_attack_event&quot;) → handle_stop_mining_block_event">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M964.09,-388.62C1040.26,-382.98 1172.31,-372.53 1285.25,-360.1 1553.92,-330.52 1620.23,-315.97 1888,-279.1 1904.01,-276.89 1920.87,-274.54 1937.49,-272.21"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="1938.73,-275.29 1948.14,-270.44 1937.75,-268.36 1938.73,-275.29"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(14) -->
+<g id="edge59" class="edge">
+<title>node_System(42)&#45;&gt;node_System(14)</title>
+<g id="a_edge59"><a xlink:title="handle_attack_event → SystemTypeSet(update_bounding_box&quot;)">
+<path fill="none" stroke="#aa3a55" stroke-width="2" d="M964.04,-404.66C1130.2,-435.52 1571.89,-519.92 1629,-555.1 1650.51,-568.35 1642.17,-588.28 1665,-599.1 1754.56,-641.54 1789.73,-612 1888,-599.1 2031.34,-580.27 2091.16,-607.61 2202.25,-515.1 2224.55,-496.52 2212.29,-478.9 2230.25,-456.1 2240.87,-442.61 2254.94,-430.18 2268.13,-420.05"/>
+<polygon fill="#aa3a55" stroke="#aa3a55" stroke-width="2" points="2270.46,-422.2 2276.43,-413.44 2266.31,-416.57 2270.46,-422.2"/>
+</a>
+</g>
+</g>
+<!-- node_System(42)&#45;&gt;node_System(32) -->
+<g id="edge60" class="edge">
+<title>node_System(42)&#45;&gt;node_System(32)</title>
+<g id="a_edge60"><a xlink:title="handle_attack_event → SystemTypeSet(walk_listener&quot;)">
+<path fill="none" stroke="#44d488" stroke-width="2" d="M928.87,-411.55C957.91,-430.47 1005.14,-460.14 1048,-482.1 1067.79,-492.23 1090.11,-502.09 1109.94,-510.34"/>
+<polygon fill="#44d488" stroke="#44d488" stroke-width="2" points="1109.35,-513.7 1119.93,-514.26 1112.01,-507.23 1109.35,-513.7"/>
+</a>
+</g>
+</g>
+<!-- node_System(43) -->
+<g id="node47" class="node">
+<title>node_System(43)</title>
+<g id="a_node47"><a xlink:title="azalea::bot::insert_bot">
+<polygon fill="lightgrey" stroke="black" points="178.75,-1290.1 108.75,-1290.1 108.75,-1254.1 178.75,-1254.1 178.75,-1290.1"/>
+<text text-anchor="middle" x="143.75" y="-1267.05" font-family="Times,serif" font-size="14.00">insert_bot</text>
+</a>
+</g>
+</g>
+<!-- node_System(44) -->
+<g id="node48" class="node">
+<title>node_System(44)</title>
+<g id="a_node48"><a xlink:title="azalea::bot::look_at_listener">
+<polygon fill="lightgrey" stroke="black" points="503.75,-456.1 400.75,-456.1 400.75,-420.1 503.75,-420.1 503.75,-456.1"/>
+<text text-anchor="middle" x="452.25" y="-433.05" font-family="Times,serif" font-size="14.00">look_at_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(44)&#45;&gt;node_System(12) -->
+<g id="edge63" class="edge">
+<title>node_System(44)&#45;&gt;node_System(12)</title>
+<g id="a_edge63"><a xlink:title="look_at_listener → SystemTypeSet(clamp_look_direction&quot;)">
+<path fill="none" stroke="#663699" stroke-width="2" d="M504.09,-433.24C533.34,-430.45 570.73,-426.88 603.81,-423.72"/>
+<polygon fill="#663699" stroke="#663699" stroke-width="2" points="604.1,-426.92 613.73,-422.48 603.44,-419.95 604.1,-426.92"/>
+</a>
+</g>
+</g>
+<!-- node_System(44)&#45;&gt;node_System(15) -->
+<g id="edge62" class="edge">
+<title>node_System(44)&#45;&gt;node_System(15)</title>
+<g id="a_edge62"><a xlink:title="look_at_listener → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#ee9e44" stroke-width="2" d="M504.14,-438.88C536.47,-439.33 579.19,-439.86 617,-440.1 677.11,-440.46 692.14,-440.56 752.25,-440.1 1222.09,-436.5 1786.93,-425.62 1985.13,-421.61"/>
+<polygon fill="#ee9e44" stroke="#ee9e44" stroke-width="2" points="1985,-425.05 1994.93,-421.35 1984.86,-418.05 1985,-425.05"/>
+</a>
+</g>
+</g>
+<!-- node_System(45) -->
+<g id="node49" class="node">
+<title>node_System(45)</title>
+<g id="a_node49"><a xlink:title="azalea::bot::jump_listener">
+<polygon fill="lightgrey" stroke="black" points="1822,-573.1 1731,-573.1 1731,-537.1 1822,-537.1 1822,-573.1"/>
+<text text-anchor="middle" x="1776.5" y="-550.05" font-family="Times,serif" font-size="14.00">jump_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(45)&#45;&gt;node_System(15) -->
+<g id="edge64" class="edge">
+<title>node_System(45)&#45;&gt;node_System(15)</title>
+<g id="a_edge64"><a xlink:title="jump_listener → SystemTypeSet(handle_force_jump&quot;)">
+<path fill="none" stroke="#3363bb" stroke-width="2" d="M1822.39,-547.59C1842.9,-543.29 1867.2,-536.96 1888,-528.1 1938.83,-506.45 1991.68,-470.41 2024.72,-445.98"/>
+<polygon fill="#3363bb" stroke="#3363bb" stroke-width="2" points="2026.82,-448.28 2032.72,-439.49 2022.62,-442.68 2026.82,-448.28"/>
+</a>
+</g>
+</g>
+<!-- node_System(46) -->
+<g id="node50" class="node">
+<title>node_System(46)</title>
+<g id="a_node50"><a xlink:title="azalea::pathfinder::goto_listener">
+<polygon fill="lightgrey" stroke="black" points="187,-562.1 100.5,-562.1 100.5,-526.1 187,-526.1 187,-562.1"/>
+<text text-anchor="middle" x="143.75" y="-539.05" font-family="Times,serif" font-size="14.00">goto_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(47) -->
+<g id="node51" class="node">
+<title>node_System(47)</title>
+<g id="a_node51"><a xlink:title="azalea::pathfinder::handle_tasks">
+<polygon fill="lightgrey" stroke="black" points="495.12,-562.1 409.38,-562.1 409.38,-526.1 495.12,-526.1 495.12,-562.1"/>
+<text text-anchor="middle" x="452.25" y="-539.05" font-family="Times,serif" font-size="14.00">handle_tasks</text>
+</a>
+</g>
+</g>
+<!-- node_System(46)&#45;&gt;node_System(47) -->
+<g id="edge65" class="edge">
+<title>node_System(46)&#45;&gt;node_System(47)</title>
+<g id="a_edge65"><a xlink:title="goto_listener → handle_tasks">
+<path fill="none" stroke="#22c2bb" stroke-width="2" d="M187.37,-544.1C241.81,-544.1 336.13,-544.1 396.03,-544.1"/>
+<polygon fill="#22c2bb" stroke="#22c2bb" stroke-width="2" points="395.99,-547.6 405.99,-544.1 395.99,-540.6 395.99,-547.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(48) -->
+<g id="node52" class="node">
+<title>node_System(48)</title>
+<g id="a_node52"><a xlink:title="azalea::pathfinder::path_found_listener">
+<polygon fill="lightgrey" stroke="black" points="746.62,-562.1 622.62,-562.1 622.62,-526.1 746.62,-526.1 746.62,-562.1"/>
+<text text-anchor="middle" x="684.62" y="-539.05" font-family="Times,serif" font-size="14.00">path_found_listener</text>
+</a>
+</g>
+</g>
+<!-- node_System(47)&#45;&gt;node_System(48) -->
+<g id="edge66" class="edge">
+<title>node_System(47)&#45;&gt;node_System(48)</title>
+<g id="a_edge66"><a xlink:title="handle_tasks → path_found_listener">
+<path fill="none" stroke="#99d955" stroke-width="2" d="M495.5,-544.1C527.48,-544.1 572.2,-544.1 610.01,-544.1"/>
+<polygon fill="#99d955" stroke="#99d955" stroke-width="2" points="609.54,-547.6 619.54,-544.1 609.54,-540.6 609.54,-547.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(49) -->
+<g id="node53" class="node">
+<title>node_System(49)</title>
+<g id="a_node53"><a xlink:title="azalea::pathfinder::stop_pathfinding_on_instance_change">
+<polygon fill="lightgrey" stroke="black" points="1012,-562.1 788.25,-562.1 788.25,-526.1 1012,-526.1 1012,-562.1"/>
+<text text-anchor="middle" x="900.12" y="-539.05" font-family="Times,serif" font-size="14.00">stop_pathfinding_on_instance_change</text>
+</a>
+</g>
+</g>
+<!-- node_System(48)&#45;&gt;node_System(49) -->
+<g id="edge68" class="edge">
+<title>node_System(48)&#45;&gt;node_System(49)</title>
+<g id="a_edge68"><a xlink:title="path_found_listener → stop_pathfinding_on_instance_change">
+<path fill="none" stroke="#881877" stroke-width="2" d="M747.09,-544.1C756,-544.1 765.42,-544.1 775.04,-544.1"/>
+<polygon fill="#881877" stroke="#881877" stroke-width="2" points="774.77,-547.6 784.77,-544.1 774.77,-540.6 774.77,-547.6"/>
+</a>
+</g>
+</g>
+<!-- node_System(49)&#45;&gt;node_System(32) -->
+<g id="edge67" class="edge">
+<title>node_System(49)&#45;&gt;node_System(32)</title>
+<g id="a_edge67"><a xlink:title="stop_pathfinding_on_instance_change → SystemTypeSet(walk_listener&quot;)">
+<path fill="none" stroke="#eede00" stroke-width="2" d="M1012.15,-539.06C1045.59,-537.54 1080.89,-535.94 1109.19,-534.66"/>
+<polygon fill="#eede00" stroke="#eede00" stroke-width="2" points="1109.25,-538.02 1119.08,-534.07 1108.93,-531.03 1109.25,-538.02"/>
+</a>
+</g>
+</g>
+<!-- node_System(50) -->
+<g id="node54" class="node">
+<title>node_System(50)</title>
+<g id="a_node54"><a xlink:title="azalea::container::handle_menu_opened_event">
+<polygon fill="lightgrey" stroke="black" points="229.38,-1337.1 58.12,-1337.1 58.12,-1301.1 229.38,-1301.1 229.38,-1337.1"/>
+<text text-anchor="middle" x="143.75" y="-1314.05" font-family="Times,serif" font-size="14.00">handle_menu_opened_event</text>
+</a>
+</g>
+</g>
+<!-- node_System(51)&#45;&gt;node_System(37) -->
+<g id="edge69" class="edge">
+<title>node_System(51)&#45;&gt;node_System(37)</title>
+<g id="a_edge69"><a xlink:title="auto_respawn → SystemTypeSet(perform_respawn&quot;)">
+<path fill="none" stroke="#00b0cc" stroke-width="2" d="M498.22,-649.1C531.63,-649.1 577.78,-649.1 615.69,-649.1"/>
+<polygon fill="#00b0cc" stroke="#00b0cc" stroke-width="2" points="615.19,-652.6 625.19,-649.1 615.19,-645.6 615.19,-652.6"/>
+</a>
+</g>
+</g>
+</g>
+</svg>