mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 14:26:04 +00:00
better behavior when we try to join twice
This commit is contained in:
parent
a824827a02
commit
d92f57d539
4 changed files with 62 additions and 3 deletions
36
CHANGELOG.md
Normal file
36
CHANGELOG.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
Due to the complexity of Azalea and the fact that almost every Minecraft version
|
||||
is breaking anyways, Semantic Versioning is not perfectly followed.
|
||||
|
||||
Not all changes will be documented here, but an effort is made to at least
|
||||
write down most non-trivial breaking changes.
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
|
||||
- This changelog. To see changes before this update, look at the git commits.
|
||||
- azalea and azalea-client now have a `packet-event` feature, which can be disabled for efficiency if you're not using `Event::Packet`.
|
||||
- `StartJoinServerEvent` can now be used to join servers exclusively from the ECS without a Tokio runtime.
|
||||
- `FormattedText::to_html` and `FormattedText::to_custom_format`.
|
||||
- [BREAKING] Add auto-reconnecting, which is enabled by default (and thus could conflict with manually implemented auto-reconnects).
|
||||
|
||||
### Changed
|
||||
|
||||
- [BREAKING] `Client::goto` is now async and completes when the client reaches its destination. `Client::start_goto` should be used if the old behavior is undesired.
|
||||
- [BREAKING] The `BlockState::id` field is now private, use `.id()` instead.
|
||||
- [BREAKING] Update to [Bevy 0.16](https://bevyengine.org/news/bevy-0-16/).
|
||||
- [BREAKING] Rename `InstanceContainer::insert` to `get_or_insert`.
|
||||
- ClientBuilder and SwarmBuilder are now Send.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Clients now validate incoming packets using the correct `MAXIMUM_UNCOMPRESSED_LENGTH` value.
|
||||
- Send the correct UUID to servers in `ClientboundHello` when we're joining in offline-mode.
|
||||
- Several protocol fixes, including for ClientboundSetPlayerTeam and a few data components.
|
||||
- Update the `InstanceName` component correctly when we receive a respawn or second login packet.
|
||||
- Block shapes and some properties were using data from `1.20.3-pre4` due to using an old data generator (Pixlyzer), which has now been replaced with the data generator from [Pumpkin](https://github.com/Pumpkin-MC/Extractor).
|
|
@ -34,7 +34,7 @@ impl Plugin for JoinPlugin {
|
|||
.add_systems(
|
||||
Update,
|
||||
(
|
||||
handle_start_join_server_event,
|
||||
handle_start_join_server_event.before(super::login::poll_auth_task),
|
||||
poll_create_connection_task,
|
||||
handle_connection_failed_events,
|
||||
)
|
||||
|
@ -44,6 +44,9 @@ impl Plugin for JoinPlugin {
|
|||
}
|
||||
|
||||
/// An event to make a client join the server and be added to our swarm.
|
||||
///
|
||||
/// This won't do anything if a client with the Account UUID is already
|
||||
/// connected to the server.
|
||||
#[derive(Event, Debug)]
|
||||
pub struct StartJoinServerEvent {
|
||||
pub account: Account,
|
||||
|
@ -85,11 +88,30 @@ pub fn handle_start_join_server_event(
|
|||
mut commands: Commands,
|
||||
mut events: EventReader<StartJoinServerEvent>,
|
||||
mut entity_uuid_index: ResMut<EntityUuidIndex>,
|
||||
connection_query: Query<&RawConnection>,
|
||||
) {
|
||||
for event in events.read() {
|
||||
let uuid = event.account.uuid_or_offline();
|
||||
let entity = if let Some(entity) = entity_uuid_index.get(&uuid) {
|
||||
debug!("Reusing entity {entity:?} for client");
|
||||
|
||||
// check if it's already connected
|
||||
if let Ok(conn) = connection_query.get(entity) {
|
||||
if conn.is_alive() {
|
||||
if let Some(start_join_callback_tx) = &event.start_join_callback_tx {
|
||||
warn!(
|
||||
"Received StartJoinServerEvent for {entity:?} but it's already connected. Ignoring the event but replying with Ok."
|
||||
);
|
||||
let _ = start_join_callback_tx.0.send(Ok(entity));
|
||||
} else {
|
||||
warn!(
|
||||
"Received StartJoinServerEvent for {entity:?} but it's already connected. Ignoring the event."
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
entity
|
||||
} else {
|
||||
let entity = commands.spawn_empty().id();
|
||||
|
@ -100,6 +122,7 @@ pub fn handle_start_join_server_event(
|
|||
};
|
||||
|
||||
let mut entity_mut = commands.entity(entity);
|
||||
|
||||
entity_mut.insert((
|
||||
// add the Account to the entity now so plugins can access it earlier
|
||||
event.account.to_owned(),
|
||||
|
|
|
@ -33,7 +33,7 @@ fn handle_receive_hello_event(trigger: Trigger<ReceiveHelloEvent>, mut commands:
|
|||
commands.entity(player).insert(AuthTask(task));
|
||||
}
|
||||
|
||||
fn poll_auth_task(
|
||||
pub fn poll_auth_task(
|
||||
mut commands: Commands,
|
||||
mut query: Query<(Entity, &mut AuthTask, &mut RawConnection)>,
|
||||
) {
|
||||
|
|
|
@ -194,7 +194,7 @@ async fn handle(bot: Client, event: azalea::Event, state: State) -> anyhow::Resu
|
|||
}
|
||||
async fn swarm_handle(_swarm: Swarm, event: SwarmEvent, _state: SwarmState) -> anyhow::Result<()> {
|
||||
match &event {
|
||||
SwarmEvent::Disconnect(account, _) => {
|
||||
SwarmEvent::Disconnect(account, _join_opts) => {
|
||||
println!("bot got kicked! {}", account.username);
|
||||
}
|
||||
SwarmEvent::Chat(chat) => {
|
||||
|
|
Loading…
Add table
Reference in a new issue