1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 14:26:04 +00:00

fix all bevy ambiguities

This commit is contained in:
mat 2023-08-25 23:28:19 -05:00
parent 2773146fbf
commit 472496b7b8
17 changed files with 1448 additions and 51 deletions

View file

@ -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(),
);

View file

@ -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()

View file

@ -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

View file

@ -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>,
) {

View file

@ -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.

View file

@ -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 {

View file

@ -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,

View file

@ -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>()

View file

@ -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 {

View file

@ -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>();
}
}

View file

@ -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;
@ -71,8 +76,7 @@ fn collide(movement: &Vec3, world: &Instance, physics: &azalea_entity::Physics)
let max_up_step = 0.6;
if on_ground && (x_collision || z_collision) {
let mut hypothetical_new_position
= collide_bounding_box(
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.,

View file

@ -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,

View file

@ -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),
);
}
}

View file

@ -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;

View file

@ -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(),
);
}
}

210
tick.svg Normal file
View file

@ -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>

After

Width:  |  Height:  |  Size: 10 KiB

1137
update.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 63 KiB