From 472496b7b808b4c6ac6f8e161a5bc1d08f5b0524 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 25 Aug 2023 23:28:19 -0500 Subject: [PATCH] fix all bevy ambiguities --- azalea-client/src/attack.rs | 15 +- azalea-client/src/client.rs | 14 +- azalea-client/src/events.rs | 2 +- azalea-client/src/interact.rs | 10 +- azalea-client/src/inventory.rs | 8 +- azalea-client/src/mining.rs | 19 +- azalea-client/src/movement.rs | 10 +- azalea-client/src/packet_handling.rs | 3 +- azalea-entity/src/plugin/indexing.rs | 1 - azalea-entity/src/plugin/mod.rs | 4 +- azalea-physics/src/collision/mod.rs | 19 +- azalea-physics/src/lib.rs | 14 +- azalea/src/auto_respawn.rs | 9 +- azalea/src/bot.rs | 11 +- azalea/src/pathfinder/mod.rs | 13 +- tick.svg | 210 +++++ update.svg | 1137 ++++++++++++++++++++++++++ 17 files changed, 1448 insertions(+), 51 deletions(-) create mode 100644 tick.svg create mode 100644 update.svg 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::() - .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) { +pub fn death_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader) { 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, mut send_packet_events: EventWriter, ) { 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::() .add_event::() .add_event::() - .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::>() .add_event::() .add_event::() 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::(); } } 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::() .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) { +pub fn jump_listener( + mut query: Query<(&mut Jumping, &mut Bot)>, + mut events: EventReader, +) { 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 @@ + + + + + + + + +clusternode_Set(1) + + +PhysicsSet + + + + + + +node_System(4) + + +send_position + + + + + +set_marker_node_Set(1)->node_System(4) + + + + + + + + +node_System(7) + + +update_attack_strength_scale + + + + + +set_marker_node_Set(1)->node_System(7) + + + + + + + + +node_System(9) + + +stop_jumping + + + + + +set_marker_node_Set(1)->node_System(9) + + + + + + + + +node_System(10) + + +tick_execute_path + + + + + +set_marker_node_Set(1)->node_System(10) + + + + + + + + +node_System(0) + + +ai_step + + + + + +node_System(1) + + +travel + + + + + +node_System(0)->node_System(1) + + + + + + + + +node_System(3) + + +local_player_ai_step + + + + + +node_System(3)->node_System(0) + + + + + + + + +node_System(3)->node_System(4) + + + + + + + + +node_System(2) + + +tick_listener + + + + + +node_System(4)->node_System(10) + + + + + + + + +node_System(5) + + +continue_mining_block + + + + + +node_System(5)->set_marker_node_Set(1) + + + + + + + + +node_System(6) + + +increment_ticks_since_last_attack + + + + + +node_System(6)->node_System(7) + + + + + + + + +node_System(8) + + +send_tick_broadcast + + + + + diff --git a/update.svg b/update.svg new file mode 100644 index 00000000..852dc447 --- /dev/null +++ b/update.svg @@ -0,0 +1,1137 @@ + + + + + + + + +clusternode_Set(5) + + +Index + + + + +clusternode_Set(26) + + +InventorySet + + + + +clusternode_Set(41) + + +MiningSet + + + + + + +node_System(3) + + +retroactively_add_game_profile_component + + + + + +set_marker_node_Set(5)->node_System(3) + + + + + + + + +node_System(5) + + +update_entity_chunk_positions + + + + + +node_System(6) + + +update_uuid_index + + + + + +node_System(7) + + +update_entity_by_id_index + + + + + + +node_System(38) + + +handle_start_mining_block_event + + + + + +set_marker_node_Set(26)->node_System(38) + + + + + + + + +node_System(39) + + +handle_start_mining_block_with_direction_event + + + + + +set_marker_node_Set(26)->node_System(39) + + + + + + + + +node_System(40) + + +handle_finish_mining_block_event + + + + + +set_marker_node_Set(26)->node_System(40) + + + + + + + + +node_System(41) + + +handle_stop_mining_block_event + + + + + +set_marker_node_Set(26)->node_System(41) + + + + + + + + +node_System(36) + + +update_modifiers_for_held_item + + + + + +set_marker_node_Set(26)->node_System(36) + + + + + + + + +node_System(24) + + +handle_menu_opened_event + + + + + +node_System(25) + + +handle_set_container_content_event + + + + + +node_System(24)->node_System(25) + + + + + + + + +node_System(26) + + +handle_container_click_event + + + + + +node_System(25)->node_System(26) + + + + + + + + +node_System(27) + + +handle_container_close_event + + + + + +node_System(26)->node_System(27) + + + + + + + + +node_System(28) + + +handle_client_side_close_container_event + + + + + +node_System(27)->node_System(28) + + + + + + + + +node_System(4) + + +handle_send_packet_event + + + + + +node_System(27)->node_System(4) + + + + + + + + + +node_System(38)->node_System(39) + + + + + + + + +node_System(14) + + +update_bounding_box + + + + + +node_System(38)->node_System(14) + + + + + + + + +node_System(15) + + +handle_force_jump + + + + + +node_System(38)->node_System(15) + + + + + + + + +node_System(35) + + +handle_swing_arm_event + + + + + +node_System(38)->node_System(35) + + + + + + + + +node_System(39)->node_System(40) + + + + + + + + +node_System(39)->node_System(14) + + + + + + + + +node_System(39)->node_System(15) + + + + + + + + +node_System(39)->node_System(35) + + + + + + + + +node_System(40)->node_System(41) + + + + + + + + +node_System(40)->node_System(14) + + + + + + + + +node_System(40)->node_System(15) + + + + + + + + +node_System(40)->node_System(35) + + + + + + + + +node_System(41)->node_System(14) + + + + + + + + +node_System(41)->node_System(15) + + + + + + + + +node_System(41)->node_System(35) + + + + + + + + +node_System(0) + + +death_event_on_0_health + + + + + +node_System(22) + + +death_listener + + + + + +node_System(0)->node_System(22) + + + + + + + + +node_System(51) + + +auto_respawn + + + + + +node_System(0)->node_System(51) + + + + + + + + +node_System(1) + + +update_in_loaded_chunk + + + + + +node_System(2) + + +death_event + + + + + +node_System(30) + + +handle_send_chat_kind_event + + + + + +node_System(4)->node_System(30) + + + + + + + + +node_System(8) + + +add_updates_received + + + + + +node_System(9) + + +debug_detect_updates_received_on_local_entities + + + + + +node_System(10) + + +debug_new_entity + + + + + +node_System(11) + + +add_dead + + + + + +node_System(12) + + +clamp_look_direction + + + + + +node_System(12)->node_System(15) + + + + + + + + +node_System(33) + + +update_hit_result_component + + + + + +node_System(12)->node_System(33) + + + + + + + + +node_System(13) + + +update_fluid_on_eyes + + + + + +node_System(13)->node_System(38) + + + + + + + + +node_System(13)->node_System(39) + + + + + + + + +node_System(13)->node_System(40) + + + + + + + + +node_System(13)->node_System(41) + + + + + + + + +node_System(15)->node_System(14) + + + + + + + + +node_System(16) + + +chat_listener + + + + + +node_System(17) + + +login_listener + + + + + +node_System(18) + + +packet_listener + + + + + +node_System(19) + + +add_player_listener + + + + + +node_System(20) + + +update_player_listener + + + + + +node_System(21) + + +remove_player_listener + + + + + +node_System(23) + + +keepalive_listener + + + + + +node_System(29) + + +handle_send_chat_event + + + + + +node_System(29)->node_System(30) + + + + + + + + +node_System(31) + + +sprint_listener + + + + + +node_System(31)->node_System(15) + + + + + + + + +node_System(32) + + +walk_listener + + + + + +node_System(31)->node_System(32) + + + + + + + + +node_System(32)->node_System(15) + + + + + + + + +node_System(32)->node_System(36) + + + + + + + + +node_System(33)->node_System(38) + + + + + + + + +node_System(33)->node_System(39) + + + + + + + + +node_System(33)->node_System(40) + + + + + + + + +node_System(33)->node_System(41) + + + + + + + + +node_System(33)->node_System(4) + + + + + + + + +node_System(34) + + +handle_block_interact_event + + + + + +node_System(33)->node_System(34) + + + + + + + + +node_System(34)->node_System(38) + + + + + + + + +node_System(34)->node_System(39) + + + + + + + + +node_System(34)->node_System(40) + + + + + + + + +node_System(34)->node_System(41) + + + + + + + + +node_System(34)->node_System(4) + + + + + + + + +node_System(34)->node_System(35) + + + + + + + + +node_System(35)->node_System(4) + + + + + + + + +node_System(37) + + +perform_respawn + + + + + +node_System(37)->node_System(4) + + + + + + + + +node_System(42) + + +handle_attack_event + + + + + +node_System(37)->node_System(42) + + + + + + + + +node_System(42)->node_System(38) + + + + + + + + +node_System(42)->node_System(39) + + + + + + + + +node_System(42)->node_System(40) + + + + + + + + +node_System(42)->node_System(41) + + + + + + + + +node_System(42)->node_System(14) + + + + + + + + +node_System(42)->node_System(32) + + + + + + + + +node_System(43) + + +insert_bot + + + + + +node_System(44) + + +look_at_listener + + + + + +node_System(44)->node_System(12) + + + + + + + + +node_System(44)->node_System(15) + + + + + + + + +node_System(45) + + +jump_listener + + + + + +node_System(45)->node_System(15) + + + + + + + + +node_System(46) + + +goto_listener + + + + + +node_System(47) + + +handle_tasks + + + + + +node_System(46)->node_System(47) + + + + + + + + +node_System(48) + + +path_found_listener + + + + + +node_System(47)->node_System(48) + + + + + + + + +node_System(49) + + +stop_pathfinding_on_instance_change + + + + + +node_System(48)->node_System(49) + + + + + + + + +node_System(49)->node_System(32) + + + + + + + + +node_System(50) + + +handle_menu_opened_event + + + + + +node_System(51)->node_System(37) + + + + + + + +