From 45fd8a0e9814deb094db7c74a438014050877c1e Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 11 Jan 2023 03:58:52 +0000 Subject: [PATCH] ok what if i just have a bunch of queries and a single packet handler system --- azalea-client/src/packet_handling.rs | 1302 ++++++++--------- .../game/clientbound_add_entity_packet.rs | 2 +- azalea-world/src/entity/metadata.rs | 264 ++-- codegen/lib/code/entity.py | 20 +- 4 files changed, 769 insertions(+), 819 deletions(-) diff --git a/azalea-client/src/packet_handling.rs b/azalea-client/src/packet_handling.rs index a3c79999..959a27b3 100644 --- a/azalea-client/src/packet_handling.rs +++ b/azalea-client/src/packet_handling.rs @@ -14,7 +14,7 @@ use azalea_protocol::{ use azalea_world::{ entity::{ metadata::{apply_metadata, Health, PlayerMetadataBundle}, - set_rotation, Dead, EntityBundle, LastSentPosition, MinecraftEntityId, Physics, + set_rotation, Dead, EntityBundle, EntityKind, LastSentPosition, MinecraftEntityId, Physics, PlayerBundle, Position, }, EntityInfos, PartialWorld, WorldContainer, @@ -34,16 +34,12 @@ use tokio::sync::mpsc; use crate::{local_player::LocalPlayer, ChatPacket, ClientInformation, Event, PlayerInfo}; pub struct PacketHandlerPlugin; -// .add_system(packet_handling::handle_packets.label("packet")) -// // should happen last -// .add_system(packet_handling::clear_packets.after("packet")); + impl Plugin for PacketHandlerPlugin { fn build(&self, app: &mut App) { app.add_system_set( SystemSet::new() .with_system(handle_packets.label("packet")) - .with_system(handle_login_packet.after("packet")) - // should happen last .with_system(clear_packets.after("packet")), ); } @@ -56,690 +52,642 @@ pub struct PacketReceiver { pub run_schedule_sender: mpsc::UnboundedSender<()>, } -fn handle_packets(ecs: &mut bevy_ecs::world::World) { - let mut query = ecs.query_filtered::<(Entity, &PacketReceiver), Changed>(); - - let mut players_and_packets = Vec::new(); - for (player_entity, packet_events) in query.iter(ecs) { - let packets = packet_events.packets.lock(); - if !packets.is_empty() { - players_and_packets.push((player_entity, packets.clone())); - } - } - for (player_entity, packets) in players_and_packets { - for packet in &packets { - handle_packet(ecs, player_entity, packet); - } - } -} - -// TODO: i want to make it so each packet handler gets its own system (so it's -// not as annoying to query stuff) but idk how to make it good - -fn handle_packet( - ecs: &mut bevy_ecs::world::World, - player_entity: Entity, - packet: &ClientboundGamePacket, -) { - match packet { - ClientboundGamePacket::Login(_p) => { - // handled by the handle_login_packet system - } - ClientboundGamePacket::SetChunkCacheRadius(p) => { - debug!("Got set chunk cache radius packet {:?}", p); - } - ClientboundGamePacket::CustomPayload(p) => { - debug!("Got custom payload packet {:?}", p); - } - ClientboundGamePacket::ChangeDifficulty(p) => { - debug!("Got difficulty packet {:?}", p); - } - ClientboundGamePacket::Commands(_p) => { - debug!("Got declare commands packet"); - } - ClientboundGamePacket::PlayerAbilities(p) => { - debug!("Got player abilities packet {:?}", p); - } - ClientboundGamePacket::SetCarriedItem(p) => { - debug!("Got set carried item packet {:?}", p); - } - ClientboundGamePacket::UpdateTags(_p) => { - debug!("Got update tags packet"); - } - ClientboundGamePacket::Disconnect(p) => { - debug!("Got disconnect packet {:?}", p); - - let local_player = ecs - .query::<&mut LocalPlayer>() - .get_mut(ecs, player_entity) - .unwrap(); - - local_player.disconnect(); - } - ClientboundGamePacket::UpdateRecipes(_p) => { - debug!("Got update recipes packet"); - } - ClientboundGamePacket::EntityEvent(_p) => { - // debug!("Got entity event packet {:?}", p); - } - ClientboundGamePacket::Recipe(_p) => { - debug!("Got recipe packet"); - } - ClientboundGamePacket::PlayerPosition(p) => { - // TODO: reply with teleport confirm - debug!("Got player position packet {:?}", p); - - let (mut local_player, mut physics, mut position, mut last_sent_position) = ecs - .query::<( - &mut LocalPlayer, - &mut Physics, - &mut Position, - &mut LastSentPosition, - )>() - .get_mut(ecs, player_entity) - .unwrap(); - - let delta_movement = physics.delta; - - let is_x_relative = p.relative_arguments.x; - let is_y_relative = p.relative_arguments.y; - let is_z_relative = p.relative_arguments.z; - - let (delta_x, new_pos_x) = if is_x_relative { - last_sent_position.x += p.x; - (delta_movement.x, position.x + p.x) - } else { - last_sent_position.x = p.x; - (0.0, p.x) - }; - let (delta_y, new_pos_y) = if is_y_relative { - last_sent_position.y += p.y; - (delta_movement.y, position.y + p.y) - } else { - last_sent_position.y = p.y; - (0.0, p.y) - }; - let (delta_z, new_pos_z) = if is_z_relative { - last_sent_position.z += p.z; - (delta_movement.z, position.z + p.z) - } else { - last_sent_position.z = p.z; - (0.0, p.z) - }; - - let mut y_rot = p.y_rot; - let mut x_rot = p.x_rot; - if p.relative_arguments.x_rot { - x_rot += physics.x_rot; - } - if p.relative_arguments.y_rot { - y_rot += physics.y_rot; - } - - physics.delta = Vec3 { - x: delta_x, - y: delta_y, - z: delta_z, - }; - // we call a function instead of setting the fields ourself since the function - // makes sure the rotations stay in their ranges - set_rotation(physics.into_inner(), y_rot, x_rot); - // TODO: minecraft sets "xo", "yo", and "zo" here but idk what that means - // so investigate that ig - let new_pos = Vec3 { - x: new_pos_x, - y: new_pos_y, - z: new_pos_z, - }; - - **position = new_pos; - - local_player.write_packet(ServerboundAcceptTeleportationPacket { id: p.id }.get()); - local_player.write_packet( - ServerboundMovePlayerPosRotPacket { - x: new_pos.x, - y: new_pos.y, - z: new_pos.z, - y_rot, - x_rot, - // this is always false - on_ground: false, - } - .get(), - ); - } - ClientboundGamePacket::PlayerInfoUpdate(p) => { - debug!("Got player info packet {:?}", p); - - let mut local_player = ecs - .query::<&mut LocalPlayer>() - .get_mut(ecs, player_entity) - .unwrap(); - - for updated_info in &p.entries { - // add the new player maybe - if p.actions.add_player { - let player_info = PlayerInfo { - profile: updated_info.profile.clone(), - uuid: updated_info.profile.uuid, - gamemode: updated_info.game_mode, - latency: updated_info.latency, - display_name: updated_info.display_name.clone(), - }; - local_player - .players - .insert(updated_info.profile.uuid, player_info.clone()); - local_player.tx.send(Event::AddPlayer(player_info)).unwrap(); - } else if let Some(info) = local_player.players.get_mut(&updated_info.profile.uuid) - { - // `else if` because the block for add_player above - // already sets all the fields - if p.actions.update_game_mode { - info.gamemode = updated_info.game_mode; - } - if p.actions.update_latency { - info.latency = updated_info.latency; - } - if p.actions.update_display_name { - info.display_name = updated_info.display_name.clone(); - } - let info = info.clone(); - local_player.tx.send(Event::UpdatePlayer(info)).unwrap(); - } else { - warn!( - "Ignoring PlayerInfoUpdate for unknown player {}", - updated_info.profile.uuid - ); - } - } - } - ClientboundGamePacket::PlayerInfoRemove(p) => { - let mut local_player = ecs - .query::<&mut LocalPlayer>() - .get_mut(ecs, player_entity) - .unwrap(); - - for uuid in &p.profile_ids { - if let Some(info) = local_player.players.remove(uuid) { - local_player.tx.send(Event::RemovePlayer(info)).unwrap(); - } - } - } - ClientboundGamePacket::SetChunkCacheCenter(p) => { - debug!("Got chunk cache center packet {:?}", p); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - let mut partial_world = local_player.partial_world.write(); - - partial_world.chunks.view_center = ChunkPos::new(p.x, p.z); - } - ClientboundGamePacket::LevelChunkWithLight(p) => { - // debug!("Got chunk with light packet {} {}", p.x, p.z); - let pos = ChunkPos::new(p.x, p.z); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - let world = local_player.world.read(); - let partial_world = local_player.partial_world.read(); - - // OPTIMIZATION: if we already know about the chunk from the - // shared world (and not ourselves), then we don't need to - // parse it again. This is only used when we have a shared - // world, since we check that the chunk isn't currently owned - // by this client. - let shared_has_chunk = world.chunks.get(&pos).is_some(); - let this_client_has_chunk = partial_world.chunks.limited_get(&pos).is_some(); - if shared_has_chunk && !this_client_has_chunk { - trace!( - "Skipping parsing chunk {:?} because we already know about it", - pos - ); - return; - } - - // ok we're sure we're going to mutate the world, so get exclusive write access - let mut partial_world = local_player.partial_world.write(); - let mut world = local_player.world.write(); - - if let Err(e) = partial_world.chunks.replace_with_packet_data( - &pos, - &mut Cursor::new(&p.chunk_data.data), - &mut world.chunks, - ) { - error!("Couldn't set chunk data: {}", e); - } - } - ClientboundGamePacket::LightUpdate(_p) => { - // debug!("Got light update packet {:?}", p); - } - ClientboundGamePacket::AddEntity(p) => { - debug!("Got add entity packet {:?}", p); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - if let Some(world_name) = &local_player.world_name { - let bundle = p.as_entity_bundle(world_name.clone()); - let mut entity_mut = ecs.spawn((MinecraftEntityId(p.id), bundle)); - // the bundle doesn't include the default entity metadata so we add that - // separately - p.apply_metadata(&mut entity_mut); - } else { - warn!("got add player packet but we haven't gotten a login packet yet"); - } - } - ClientboundGamePacket::SetEntityData(p) => { - debug!("Got set entity data packet {:?}", p); - - let local_player = ecs - .query::<&mut LocalPlayer>() - .get(ecs, player_entity) - .unwrap(); - let partial_world = local_player.partial_world.write(); - let entity = partial_world - .entity_infos - .get_by_id(MinecraftEntityId(p.id)); - drop(partial_world); - - if let Some(entity) = entity { - let mut entity_mut = ecs.entity_mut(entity); - if let Err(e) = apply_metadata(&mut entity_mut, (*p.packed_items).clone()) { - warn!("{e}"); - } - } else { - warn!("Server sent an entity data packet for an entity id ({}) that we don't know about", p.id); - } - } - ClientboundGamePacket::UpdateAttributes(_p) => { - // debug!("Got update attributes packet {:?}", p); - } - ClientboundGamePacket::SetEntityMotion(_p) => { - // debug!("Got entity velocity packet {:?}", p); - } - ClientboundGamePacket::SetEntityLink(p) => { - debug!("Got set entity link packet {:?}", p); - } - ClientboundGamePacket::AddPlayer(p) => { - debug!("Got add player packet {:?}", p); - - let local_player = ecs - .query::<&mut LocalPlayer>() - .get(ecs, player_entity) - .unwrap(); - if let Some(world_name) = &local_player.world_name { - let bundle = p.as_player_bundle(world_name.clone()); - ecs.spawn((MinecraftEntityId(p.id), bundle)); - } else { - warn!("got add player packet but we haven't gotten a login packet yet"); - } - } - ClientboundGamePacket::InitializeBorder(p) => { - debug!("Got initialize border packet {:?}", p); - } - ClientboundGamePacket::SetTime(p) => { - debug!("Got set time packet {:?}", p); - } - ClientboundGamePacket::SetDefaultSpawnPosition(p) => { - debug!("Got set default spawn position packet {:?}", p); - } - ClientboundGamePacket::ContainerSetContent(p) => { - debug!("Got container set content packet {:?}", p); - } - ClientboundGamePacket::SetHealth(p) => { - debug!("Got set health packet {:?}", p); - - let mut health = ecs - .query::<&mut Health>() - .get_mut(ecs, player_entity) - .unwrap(); - **health = p.health; - - // the `Dead` component is added by `update_dead` in azalea-world - // and then the `dead_event` system fires the Death event. - } - ClientboundGamePacket::SetExperience(p) => { - debug!("Got set experience packet {:?}", p); - } - ClientboundGamePacket::TeleportEntity(p) => { - let local_player = ecs - .query::<&mut LocalPlayer>() - .get(ecs, player_entity) - .unwrap(); - let partial_world = local_player.partial_world.read(); - let partial_entity_infos = &partial_world.entity_infos; - let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.id)); - drop(partial_world); - - if let Some(entity) = entity { - let mut position = ecs.query::<&mut Position>().get_mut(ecs, entity).unwrap(); - **position = p.position; - } else { - warn!("Got teleport entity packet for unknown entity id {}", p.id); - } - } - ClientboundGamePacket::UpdateAdvancements(p) => { - debug!("Got update advancements packet {:?}", p); - } - ClientboundGamePacket::RotateHead(_p) => { - // debug!("Got rotate head packet {:?}", p); - } - ClientboundGamePacket::MoveEntityPos(p) => { - let local_player = ecs - .query::<&mut LocalPlayer>() - .get(ecs, player_entity) - .unwrap(); - let partial_world = local_player.partial_world.read(); - let partial_entity_infos = &partial_world.entity_infos; - let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.entity_id)); - drop(partial_world); - - if let Some(entity) = entity { - let mut position = ecs.query::<&mut Position>().get_mut(ecs, entity).unwrap(); - **position = position.with_delta(&p.delta); - } else { - warn!( - "Got move entity pos packet for unknown entity id {}", - p.entity_id - ); - } - } - ClientboundGamePacket::MoveEntityPosRot(p) => { - let local_player = ecs - .query::<&mut LocalPlayer>() - .get(ecs, player_entity) - .unwrap(); - let partial_world = local_player.partial_world.read(); - let partial_entity_infos = &partial_world.entity_infos; - let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.entity_id)); - drop(partial_world); - - if let Some(entity) = entity { - let mut position = ecs.query::<&mut Position>().get_mut(ecs, entity).unwrap(); - **position = position.with_delta(&p.delta); - } else { - warn!( - "Got move entity pos rot packet for unknown entity id {}", - p.entity_id - ); - } - } - ClientboundGamePacket::MoveEntityRot(_p) => { - // debug!("Got move entity rot packet {:?}", p); - } - ClientboundGamePacket::KeepAlive(p) => { - debug!("Got keep alive packet {:?}", p); - - let mut local_player = ecs - .query::<&mut LocalPlayer>() - .get_mut(ecs, player_entity) - .unwrap(); - - local_player.write_packet(ServerboundKeepAlivePacket { id: p.id }.get()); - } - ClientboundGamePacket::RemoveEntities(p) => { - debug!("Got remove entities packet {:?}", p); - } - ClientboundGamePacket::PlayerChat(p) => { - debug!("Got player chat packet {:?}", p); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - - local_player - .tx - .send(Event::Chat(ChatPacket::Player(Arc::new(p.clone())))) - .unwrap(); - } - ClientboundGamePacket::SystemChat(p) => { - debug!("Got system chat packet {:?}", p); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - - local_player - .tx - .send(Event::Chat(ChatPacket::System(Arc::new(p.clone())))) - .unwrap(); - } - ClientboundGamePacket::Sound(_p) => { - // debug!("Got sound packet {:?}", p); - } - ClientboundGamePacket::LevelEvent(p) => { - debug!("Got level event packet {:?}", p); - } - ClientboundGamePacket::BlockUpdate(p) => { - debug!("Got block update packet {:?}", p); - - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - let world = local_player.world.write(); - - world.chunks.set_block_state(&p.pos, p.block_state); - } - ClientboundGamePacket::Animate(p) => { - debug!("Got animate packet {:?}", p); - } - ClientboundGamePacket::SectionBlocksUpdate(p) => { - debug!("Got section blocks update packet {:?}", p); - let local_player = ecs.query::<&LocalPlayer>().get(ecs, player_entity).unwrap(); - let world = local_player.world.write(); - - for state in &p.states { - world - .chunks - .set_block_state(&(p.section_pos + state.pos.clone()), state.state); - } - } - ClientboundGamePacket::GameEvent(p) => { - debug!("Got game event packet {:?}", p); - } - ClientboundGamePacket::LevelParticles(p) => { - debug!("Got level particles packet {:?}", p); - } - ClientboundGamePacket::ServerData(p) => { - debug!("Got server data packet {:?}", p); - } - ClientboundGamePacket::SetEquipment(p) => { - debug!("Got set equipment packet {:?}", p); - } - ClientboundGamePacket::UpdateMobEffect(p) => { - debug!("Got update mob effect packet {:?}", p); - } - ClientboundGamePacket::AddExperienceOrb(_) => {} - ClientboundGamePacket::AwardStats(_) => {} - ClientboundGamePacket::BlockChangedAck(_) => {} - ClientboundGamePacket::BlockDestruction(_) => {} - ClientboundGamePacket::BlockEntityData(_) => {} - ClientboundGamePacket::BlockEvent(_) => {} - ClientboundGamePacket::BossEvent(_) => {} - ClientboundGamePacket::CommandSuggestions(_) => {} - ClientboundGamePacket::ContainerSetData(_) => {} - ClientboundGamePacket::ContainerSetSlot(_) => {} - ClientboundGamePacket::Cooldown(_) => {} - ClientboundGamePacket::CustomChatCompletions(_) => {} - ClientboundGamePacket::DeleteChat(_) => {} - ClientboundGamePacket::Explode(_) => {} - ClientboundGamePacket::ForgetLevelChunk(_) => {} - ClientboundGamePacket::HorseScreenOpen(_) => {} - ClientboundGamePacket::MapItemData(_) => {} - ClientboundGamePacket::MerchantOffers(_) => {} - ClientboundGamePacket::MoveVehicle(_) => {} - ClientboundGamePacket::OpenBook(_) => {} - ClientboundGamePacket::OpenScreen(_) => {} - ClientboundGamePacket::OpenSignEditor(_) => {} - ClientboundGamePacket::Ping(_) => {} - ClientboundGamePacket::PlaceGhostRecipe(_) => {} - ClientboundGamePacket::PlayerCombatEnd(_) => {} - ClientboundGamePacket::PlayerCombatEnter(_) => {} - ClientboundGamePacket::PlayerCombatKill(p) => { - debug!("Got player kill packet {:?}", p); - let (&entity_id, dead) = ecs - .query::<(&MinecraftEntityId, Option<&Dead>)>() - .get(ecs, player_entity) - .unwrap(); - - if *entity_id == p.player_id && dead.is_none() { - ecs.entity_mut(player_entity).insert(Dead); - - let local_player = ecs - .query::<&mut LocalPlayer>() - .get_mut(ecs, player_entity) - .unwrap(); - local_player - .tx - .send(Event::Death(Some(Arc::new(p.clone())))) - .unwrap(); - } - } - ClientboundGamePacket::PlayerLookAt(_) => {} - ClientboundGamePacket::RemoveMobEffect(_) => {} - ClientboundGamePacket::ResourcePack(_) => {} - ClientboundGamePacket::Respawn(p) => { - debug!("Got respawn packet {:?}", p); - // Remove the Dead marker component from the player. - ecs.entity_mut(player_entity).remove::(); - } - ClientboundGamePacket::SelectAdvancementsTab(_) => {} - ClientboundGamePacket::SetActionBarText(_) => {} - ClientboundGamePacket::SetBorderCenter(_) => {} - ClientboundGamePacket::SetBorderLerpSize(_) => {} - ClientboundGamePacket::SetBorderSize(_) => {} - ClientboundGamePacket::SetBorderWarningDelay(_) => {} - ClientboundGamePacket::SetBorderWarningDistance(_) => {} - ClientboundGamePacket::SetCamera(_) => {} - ClientboundGamePacket::SetDisplayObjective(_) => {} - ClientboundGamePacket::SetObjective(_) => {} - ClientboundGamePacket::SetPassengers(_) => {} - ClientboundGamePacket::SetPlayerTeam(_) => {} - ClientboundGamePacket::SetScore(_) => {} - ClientboundGamePacket::SetSimulationDistance(_) => {} - ClientboundGamePacket::SetSubtitleText(_) => {} - ClientboundGamePacket::SetTitleText(_) => {} - ClientboundGamePacket::SetTitlesAnimation(_) => {} - ClientboundGamePacket::SoundEntity(_) => {} - ClientboundGamePacket::StopSound(_) => {} - ClientboundGamePacket::TabList(_) => {} - ClientboundGamePacket::TagQuery(_) => {} - ClientboundGamePacket::TakeItemEntity(_) => {} - ClientboundGamePacket::DisguisedChat(_) => {} - ClientboundGamePacket::UpdateEnabledFeatures(_) => {} - ClientboundGamePacket::ContainerClose(_) => {} - } -} - -// this is probably inefficient since it has to iterate over every packet even -// if it's not the right one -fn handle_login_packet( +fn handle_packets( mut commands: Commands, - mut query: Query<(Entity, &PacketReceiver, &mut LocalPlayer), Changed>, + query: Query<(Entity, &PacketReceiver), Changed>, + local_player_query: Query<&LocalPlayer>, + entity_kind_query: Query<&EntityKind>, + mut mut_local_player_query: Query<&mut LocalPlayer>, + mut mut_health_query: Query<&mut Health>, + mut mut_position_query: Query<&mut Position>, + combat_kill_query: Query<(&MinecraftEntityId, Option<&Dead>)>, + mut position_query: Query<( + &mut LocalPlayer, + &mut Physics, + &mut Position, + &mut LastSentPosition, + )>, mut world_container: ResMut, mut entity_infos: ResMut, ) { - for (player_entity, packet_events, mut local_player) in query.iter_mut() { - for packet in packet_events.packets.lock().iter() { - if let ClientboundGamePacket::Login(p) = packet { - debug!("Got login packet"); + for (player_entity, packet_events) in &query { + let packets = packet_events.packets.lock(); - { - // TODO: have registry_holder be a struct because this sucks rn - // best way would be to add serde support to azalea-nbt + for packet in packets.iter() { + match packet { + ClientboundGamePacket::Login(p) => { + debug!("Got login packet"); + let mut local_player = mut_local_player_query.get_mut(player_entity).unwrap(); - let registry_holder = p - .registry_holder - .as_compound() - .expect("Registry holder is not a compound") - .get("") - .expect("No \"\" tag") - .as_compound() - .expect("\"\" tag is not a compound"); - let dimension_types = registry_holder - .get("minecraft:dimension_type") - .expect("No dimension_type tag") - .as_compound() - .expect("dimension_type is not a compound") - .get("value") - .expect("No dimension_type value") - .as_list() - .expect("dimension_type value is not a list"); - let dimension_type = dimension_types - .iter() - .find(|t| { - t.as_compound() - .expect("dimension_type value is not a compound") - .get("name") - .expect("No name tag") - .as_string() - .expect("name is not a string") - == p.dimension_type.to_string() - }) - .unwrap_or_else(|| { - panic!("No dimension_type with name {}", p.dimension_type) - }) - .as_compound() - .unwrap() - .get("element") - .expect("No element tag") - .as_compound() - .expect("element is not a compound"); - let height = (*dimension_type - .get("height") - .expect("No height tag") - .as_int() - .expect("height tag is not an int")) - .try_into() - .expect("height is not a u32"); - let min_y = *dimension_type - .get("min_y") - .expect("No min_y tag") - .as_int() - .expect("min_y tag is not an int"); + { + // TODO: have registry_holder be a struct because this sucks rn + // best way would be to add serde support to azalea-nbt - let world_name = p.dimension.clone(); + let registry_holder = p + .registry_holder + .as_compound() + .expect("Registry holder is not a compound") + .get("") + .expect("No \"\" tag") + .as_compound() + .expect("\"\" tag is not a compound"); + let dimension_types = registry_holder + .get("minecraft:dimension_type") + .expect("No dimension_type tag") + .as_compound() + .expect("dimension_type is not a compound") + .get("value") + .expect("No dimension_type value") + .as_list() + .expect("dimension_type value is not a list"); + let dimension_type = dimension_types + .iter() + .find(|t| { + t.as_compound() + .expect("dimension_type value is not a compound") + .get("name") + .expect("No name tag") + .as_string() + .expect("name is not a string") + == p.dimension_type.to_string() + }) + .unwrap_or_else(|| { + panic!("No dimension_type with name {}", p.dimension_type) + }) + .as_compound() + .unwrap() + .get("element") + .expect("No element tag") + .as_compound() + .expect("element is not a compound"); + let height = (*dimension_type + .get("height") + .expect("No height tag") + .as_int() + .expect("height tag is not an int")) + .try_into() + .expect("height is not a u32"); + let min_y = *dimension_type + .get("min_y") + .expect("No min_y tag") + .as_int() + .expect("min_y tag is not an int"); - local_player.world_name = Some(world_name.clone()); - // add this world to the world_container (or don't if it's already there) - let weak_world = world_container.insert(world_name.clone(), height, min_y); - // set the partial_world to an empty world - // (when we add chunks or entities those will be in the world_container) + let world_name = p.dimension.clone(); - *local_player.partial_world.write() = PartialWorld::new( - local_player.client_information.view_distance.into(), - // this argument makes it so other clients don't update this player entity - // in a shared world - Some(player_entity), - &mut entity_infos, - ); - local_player.world = weak_world; + local_player.world_name = Some(world_name.clone()); + // add this world to the world_container (or don't if it's already + // there) + let weak_world = world_container.insert(world_name.clone(), height, min_y); + // set the partial_world to an empty world + // (when we add chunks or entities those will be in the + // world_container) - let player_bundle = PlayerBundle { - entity: EntityBundle::new( - local_player.profile.uuid, - Vec3::default(), - azalea_registry::EntityKind::Player, - world_name, - ), - metadata: PlayerMetadataBundle::default(), - }; - // insert our components into the ecs :) - commands - .entity(player_entity) - .insert((MinecraftEntityId(p.player_id), player_bundle)); - } + *local_player.partial_world.write() = PartialWorld::new( + local_player.client_information.view_distance.into(), + // this argument makes it so other clients don't update this + // player entity + // in a shared world + Some(player_entity), + &mut entity_infos, + ); + local_player.world = weak_world; - // send the client information that we have set - let client_information_packet: ClientInformation = - local_player.client_information.clone(); - log::debug!( - "Sending client information because login: {:?}", - client_information_packet - ); - local_player.write_packet(client_information_packet.get()); - - // brand - local_player.write_packet( - ServerboundCustomPayloadPacket { - identifier: ResourceLocation::new("brand").unwrap(), - // they don't have to know :) - data: "vanilla".into(), + let player_bundle = PlayerBundle { + entity: EntityBundle::new( + local_player.profile.uuid, + Vec3::default(), + azalea_registry::EntityKind::Player, + world_name, + ), + metadata: PlayerMetadataBundle::default(), + }; + // insert our components into the ecs :) + commands + .entity(player_entity) + .insert((MinecraftEntityId(p.player_id), player_bundle)); } - .get(), - ); - local_player.tx.send(Event::Login).unwrap(); + // send the client information that we have set + let client_information_packet: ClientInformation = + local_player.client_information.clone(); + log::debug!( + "Sending client information because login: {:?}", + client_information_packet + ); + local_player.write_packet(client_information_packet.get()); + + // brand + local_player.write_packet( + ServerboundCustomPayloadPacket { + identifier: ResourceLocation::new("brand").unwrap(), + // they don't have to know :) + data: "vanilla".into(), + } + .get(), + ); + + local_player.tx.send(Event::Login).unwrap(); + } + ClientboundGamePacket::SetChunkCacheRadius(p) => { + debug!("Got set chunk cache radius packet {:?}", p); + } + ClientboundGamePacket::CustomPayload(p) => { + debug!("Got custom payload packet {:?}", p); + } + ClientboundGamePacket::ChangeDifficulty(p) => { + debug!("Got difficulty packet {:?}", p); + } + ClientboundGamePacket::Commands(_p) => { + debug!("Got declare commands packet"); + } + ClientboundGamePacket::PlayerAbilities(p) => { + debug!("Got player abilities packet {:?}", p); + } + ClientboundGamePacket::SetCarriedItem(p) => { + debug!("Got set carried item packet {:?}", p); + } + ClientboundGamePacket::UpdateTags(_p) => { + debug!("Got update tags packet"); + } + ClientboundGamePacket::Disconnect(p) => { + debug!("Got disconnect packet {:?}", p); + let local_player = local_player_query.get(player_entity).unwrap(); + local_player.disconnect(); + } + ClientboundGamePacket::UpdateRecipes(_p) => { + debug!("Got update recipes packet"); + } + ClientboundGamePacket::EntityEvent(_p) => { + // debug!("Got entity event packet {:?}", p); + } + ClientboundGamePacket::Recipe(_p) => { + debug!("Got recipe packet"); + } + ClientboundGamePacket::PlayerPosition(p) => { + // TODO: reply with teleport confirm + debug!("Got player position packet {:?}", p); + + let (mut local_player, mut physics, mut position, mut last_sent_position) = + position_query.get_mut(player_entity).unwrap(); + + let delta_movement = physics.delta; + + let is_x_relative = p.relative_arguments.x; + let is_y_relative = p.relative_arguments.y; + let is_z_relative = p.relative_arguments.z; + + let (delta_x, new_pos_x) = if is_x_relative { + last_sent_position.x += p.x; + (delta_movement.x, position.x + p.x) + } else { + last_sent_position.x = p.x; + (0.0, p.x) + }; + let (delta_y, new_pos_y) = if is_y_relative { + last_sent_position.y += p.y; + (delta_movement.y, position.y + p.y) + } else { + last_sent_position.y = p.y; + (0.0, p.y) + }; + let (delta_z, new_pos_z) = if is_z_relative { + last_sent_position.z += p.z; + (delta_movement.z, position.z + p.z) + } else { + last_sent_position.z = p.z; + (0.0, p.z) + }; + + let mut y_rot = p.y_rot; + let mut x_rot = p.x_rot; + if p.relative_arguments.x_rot { + x_rot += physics.x_rot; + } + if p.relative_arguments.y_rot { + y_rot += physics.y_rot; + } + + physics.delta = Vec3 { + x: delta_x, + y: delta_y, + z: delta_z, + }; + // we call a function instead of setting the fields ourself since the + // function makes sure the rotations stay in their + // ranges + set_rotation(physics.into_inner(), y_rot, x_rot); + // TODO: minecraft sets "xo", "yo", and "zo" here but idk what that means + // so investigate that ig + let new_pos = Vec3 { + x: new_pos_x, + y: new_pos_y, + z: new_pos_z, + }; + + **position = new_pos; + + local_player + .write_packet(ServerboundAcceptTeleportationPacket { id: p.id }.get()); + local_player.write_packet( + ServerboundMovePlayerPosRotPacket { + x: new_pos.x, + y: new_pos.y, + z: new_pos.z, + y_rot, + x_rot, + // this is always false + on_ground: false, + } + .get(), + ); + } + ClientboundGamePacket::PlayerInfoUpdate(p) => { + debug!("Got player info packet {:?}", p); + + let mut local_player = mut_local_player_query.get_mut(player_entity).unwrap(); + + for updated_info in &p.entries { + // add the new player maybe + if p.actions.add_player { + let player_info = PlayerInfo { + profile: updated_info.profile.clone(), + uuid: updated_info.profile.uuid, + gamemode: updated_info.game_mode, + latency: updated_info.latency, + display_name: updated_info.display_name.clone(), + }; + local_player + .players + .insert(updated_info.profile.uuid, player_info.clone()); + local_player.tx.send(Event::AddPlayer(player_info)).unwrap(); + } else if let Some(info) = + local_player.players.get_mut(&updated_info.profile.uuid) + { + // `else if` because the block for add_player above + // already sets all the fields + if p.actions.update_game_mode { + info.gamemode = updated_info.game_mode; + } + if p.actions.update_latency { + info.latency = updated_info.latency; + } + if p.actions.update_display_name { + info.display_name = updated_info.display_name.clone(); + } + let info = info.clone(); + local_player.tx.send(Event::UpdatePlayer(info)).unwrap(); + } else { + warn!( + "Ignoring PlayerInfoUpdate for unknown player {}", + updated_info.profile.uuid + ); + } + } + } + ClientboundGamePacket::PlayerInfoRemove(p) => { + let mut local_player = mut_local_player_query.get_mut(player_entity).unwrap(); + + for uuid in &p.profile_ids { + if let Some(info) = local_player.players.remove(uuid) { + local_player.tx.send(Event::RemovePlayer(info)).unwrap(); + } + } + } + ClientboundGamePacket::SetChunkCacheCenter(p) => { + debug!("Got chunk cache center packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + let mut partial_world = local_player.partial_world.write(); + + partial_world.chunks.view_center = ChunkPos::new(p.x, p.z); + } + ClientboundGamePacket::LevelChunkWithLight(p) => { + // debug!("Got chunk with light packet {} {}", p.x, p.z); + let pos = ChunkPos::new(p.x, p.z); + + let local_player = local_player_query.get(player_entity).unwrap(); + let world = local_player.world.read(); + let partial_world = local_player.partial_world.read(); + + // OPTIMIZATION: if we already know about the chunk from the + // shared world (and not ourselves), then we don't need to + // parse it again. This is only used when we have a shared + // world, since we check that the chunk isn't currently owned + // by this client. + let shared_has_chunk = world.chunks.get(&pos).is_some(); + let this_client_has_chunk = partial_world.chunks.limited_get(&pos).is_some(); + if shared_has_chunk && !this_client_has_chunk { + trace!( + "Skipping parsing chunk {:?} because we already know about it", + pos + ); + return; + } + + // ok we're sure we're going to mutate the world, so get exclusive write + // access + let mut partial_world = local_player.partial_world.write(); + let mut world = local_player.world.write(); + + if let Err(e) = partial_world.chunks.replace_with_packet_data( + &pos, + &mut Cursor::new(&p.chunk_data.data), + &mut world.chunks, + ) { + error!("Couldn't set chunk data: {}", e); + } + } + ClientboundGamePacket::LightUpdate(_p) => { + // debug!("Got light update packet {:?}", p); + } + ClientboundGamePacket::AddEntity(p) => { + debug!("Got add entity packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + if let Some(world_name) = &local_player.world_name { + let bundle = p.as_entity_bundle(world_name.clone()); + let mut entity_commands = commands.spawn((MinecraftEntityId(p.id), bundle)); + // the bundle doesn't include the default entity metadata so we add that + // separately + p.apply_metadata(&mut entity_commands); + } else { + warn!("got add player packet but we haven't gotten a login packet yet"); + } + } + ClientboundGamePacket::SetEntityData(p) => { + debug!("Got set entity data packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + let partial_world = local_player.partial_world.write(); + let entity = partial_world + .entity_infos + .get_by_id(MinecraftEntityId(p.id)); + drop(partial_world); + + if let Some(entity) = entity { + let entity_kind = entity_kind_query + .get(entity) + .expect("EntityKind should always be present"); + let mut entity_commands = commands.entity(entity); + if let Err(e) = apply_metadata( + &mut entity_commands, + **entity_kind, + (*p.packed_items).clone(), + ) { + warn!("{e}"); + } + } else { + warn!("Server sent an entity data packet for an entity id ({}) that we don't know about", p.id); + } + } + ClientboundGamePacket::UpdateAttributes(_p) => { + // debug!("Got update attributes packet {:?}", p); + } + ClientboundGamePacket::SetEntityMotion(_p) => { + // debug!("Got entity velocity packet {:?}", p); + } + ClientboundGamePacket::SetEntityLink(p) => { + debug!("Got set entity link packet {:?}", p); + } + ClientboundGamePacket::AddPlayer(p) => { + debug!("Got add player packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + if let Some(world_name) = &local_player.world_name { + let bundle = p.as_player_bundle(world_name.clone()); + commands.spawn((MinecraftEntityId(p.id), bundle)); + } else { + warn!("got add player packet but we haven't gotten a login packet yet"); + } + } + ClientboundGamePacket::InitializeBorder(p) => { + debug!("Got initialize border packet {:?}", p); + } + ClientboundGamePacket::SetTime(p) => { + debug!("Got set time packet {:?}", p); + } + ClientboundGamePacket::SetDefaultSpawnPosition(p) => { + debug!("Got set default spawn position packet {:?}", p); + } + ClientboundGamePacket::ContainerSetContent(p) => { + debug!("Got container set content packet {:?}", p); + } + ClientboundGamePacket::SetHealth(p) => { + debug!("Got set health packet {:?}", p); + + let mut health = mut_health_query.get_mut(player_entity).unwrap(); + **health = p.health; + + // the `Dead` component is added by `update_dead` in + // azalea-world and then the + // `dead_event` system fires the Death event. + } + ClientboundGamePacket::SetExperience(p) => { + debug!("Got set experience packet {:?}", p); + } + ClientboundGamePacket::TeleportEntity(p) => { + let local_player = local_player_query.get(player_entity).unwrap(); + let partial_world = local_player.partial_world.read(); + let partial_entity_infos = &partial_world.entity_infos; + let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.id)); + drop(partial_world); + + if let Some(entity) = entity { + let mut position = mut_position_query.get_mut(entity).unwrap(); + **position = p.position; + } else { + warn!("Got teleport entity packet for unknown entity id {}", p.id); + } + } + ClientboundGamePacket::UpdateAdvancements(p) => { + debug!("Got update advancements packet {:?}", p); + } + ClientboundGamePacket::RotateHead(_p) => { + // debug!("Got rotate head packet {:?}", p); + } + ClientboundGamePacket::MoveEntityPos(p) => { + let local_player = local_player_query.get(player_entity).unwrap(); + let partial_world = local_player.partial_world.read(); + let partial_entity_infos = &partial_world.entity_infos; + let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.entity_id)); + drop(partial_world); + + if let Some(entity) = entity { + let mut position = mut_position_query.get_mut(entity).unwrap(); + **position = position.with_delta(&p.delta); + } else { + warn!( + "Got move entity pos packet for unknown entity id {}", + p.entity_id + ); + } + } + ClientboundGamePacket::MoveEntityPosRot(p) => { + let local_player = local_player_query.get(player_entity).unwrap(); + let partial_world = local_player.partial_world.read(); + let partial_entity_infos = &partial_world.entity_infos; + let entity = partial_entity_infos.get_by_id(MinecraftEntityId(p.entity_id)); + drop(partial_world); + + if let Some(entity) = entity { + let mut position = mut_position_query.get_mut(entity).unwrap(); + **position = position.with_delta(&p.delta); + } else { + warn!( + "Got move entity pos rot packet for unknown entity id {}", + p.entity_id + ); + } + } + ClientboundGamePacket::MoveEntityRot(_p) => { + // debug!("Got move entity rot packet {:?}", p); + } + ClientboundGamePacket::KeepAlive(p) => { + debug!("Got keep alive packet {:?}", p); + + let mut local_player = mut_local_player_query.get_mut(player_entity).unwrap(); + local_player.write_packet(ServerboundKeepAlivePacket { id: p.id }.get()); + } + ClientboundGamePacket::RemoveEntities(p) => { + debug!("Got remove entities packet {:?}", p); + } + ClientboundGamePacket::PlayerChat(p) => { + debug!("Got player chat packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + + local_player + .tx + .send(Event::Chat(ChatPacket::Player(Arc::new(p.clone())))) + .unwrap(); + } + ClientboundGamePacket::SystemChat(p) => { + debug!("Got system chat packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + + local_player + .tx + .send(Event::Chat(ChatPacket::System(Arc::new(p.clone())))) + .unwrap(); + } + ClientboundGamePacket::Sound(_p) => { + // debug!("Got sound packet {:?}", p); + } + ClientboundGamePacket::LevelEvent(p) => { + debug!("Got level event packet {:?}", p); + } + ClientboundGamePacket::BlockUpdate(p) => { + debug!("Got block update packet {:?}", p); + + let local_player = local_player_query.get(player_entity).unwrap(); + let world = local_player.world.write(); + + world.chunks.set_block_state(&p.pos, p.block_state); + } + ClientboundGamePacket::Animate(p) => { + debug!("Got animate packet {:?}", p); + } + ClientboundGamePacket::SectionBlocksUpdate(p) => { + debug!("Got section blocks update packet {:?}", p); + let local_player = local_player_query.get(player_entity).unwrap(); + let world = local_player.world.write(); + + for state in &p.states { + world + .chunks + .set_block_state(&(p.section_pos + state.pos.clone()), state.state); + } + } + ClientboundGamePacket::GameEvent(p) => { + debug!("Got game event packet {:?}", p); + } + ClientboundGamePacket::LevelParticles(p) => { + debug!("Got level particles packet {:?}", p); + } + ClientboundGamePacket::ServerData(p) => { + debug!("Got server data packet {:?}", p); + } + ClientboundGamePacket::SetEquipment(p) => { + debug!("Got set equipment packet {:?}", p); + } + ClientboundGamePacket::UpdateMobEffect(p) => { + debug!("Got update mob effect packet {:?}", p); + } + ClientboundGamePacket::AddExperienceOrb(_) => {} + ClientboundGamePacket::AwardStats(_) => {} + ClientboundGamePacket::BlockChangedAck(_) => {} + ClientboundGamePacket::BlockDestruction(_) => {} + ClientboundGamePacket::BlockEntityData(_) => {} + ClientboundGamePacket::BlockEvent(_) => {} + ClientboundGamePacket::BossEvent(_) => {} + ClientboundGamePacket::CommandSuggestions(_) => {} + ClientboundGamePacket::ContainerSetData(_) => {} + ClientboundGamePacket::ContainerSetSlot(_) => {} + ClientboundGamePacket::Cooldown(_) => {} + ClientboundGamePacket::CustomChatCompletions(_) => {} + ClientboundGamePacket::DeleteChat(_) => {} + ClientboundGamePacket::Explode(_) => {} + ClientboundGamePacket::ForgetLevelChunk(_) => {} + ClientboundGamePacket::HorseScreenOpen(_) => {} + ClientboundGamePacket::MapItemData(_) => {} + ClientboundGamePacket::MerchantOffers(_) => {} + ClientboundGamePacket::MoveVehicle(_) => {} + ClientboundGamePacket::OpenBook(_) => {} + ClientboundGamePacket::OpenScreen(_) => {} + ClientboundGamePacket::OpenSignEditor(_) => {} + ClientboundGamePacket::Ping(_) => {} + ClientboundGamePacket::PlaceGhostRecipe(_) => {} + ClientboundGamePacket::PlayerCombatEnd(_) => {} + ClientboundGamePacket::PlayerCombatEnter(_) => {} + ClientboundGamePacket::PlayerCombatKill(p) => { + debug!("Got player kill packet {:?}", p); + let (&entity_id, dead) = combat_kill_query.get(player_entity).unwrap(); + + if *entity_id == p.player_id && dead.is_none() { + commands.entity(player_entity).insert(Dead); + + let local_player = local_player_query.get(player_entity).unwrap(); + local_player + .tx + .send(Event::Death(Some(Arc::new(p.clone())))) + .unwrap(); + } + } + ClientboundGamePacket::PlayerLookAt(_) => {} + ClientboundGamePacket::RemoveMobEffect(_) => {} + ClientboundGamePacket::ResourcePack(_) => {} + ClientboundGamePacket::Respawn(p) => { + debug!("Got respawn packet {:?}", p); + // Remove the Dead marker component from the player. + commands.entity(player_entity).remove::(); + } + ClientboundGamePacket::SelectAdvancementsTab(_) => {} + ClientboundGamePacket::SetActionBarText(_) => {} + ClientboundGamePacket::SetBorderCenter(_) => {} + ClientboundGamePacket::SetBorderLerpSize(_) => {} + ClientboundGamePacket::SetBorderSize(_) => {} + ClientboundGamePacket::SetBorderWarningDelay(_) => {} + ClientboundGamePacket::SetBorderWarningDistance(_) => {} + ClientboundGamePacket::SetCamera(_) => {} + ClientboundGamePacket::SetDisplayObjective(_) => {} + ClientboundGamePacket::SetObjective(_) => {} + ClientboundGamePacket::SetPassengers(_) => {} + ClientboundGamePacket::SetPlayerTeam(_) => {} + ClientboundGamePacket::SetScore(_) => {} + ClientboundGamePacket::SetSimulationDistance(_) => {} + ClientboundGamePacket::SetSubtitleText(_) => {} + ClientboundGamePacket::SetTitleText(_) => {} + ClientboundGamePacket::SetTitlesAnimation(_) => {} + ClientboundGamePacket::SoundEntity(_) => {} + ClientboundGamePacket::StopSound(_) => {} + ClientboundGamePacket::TabList(_) => {} + ClientboundGamePacket::TagQuery(_) => {} + ClientboundGamePacket::TakeItemEntity(_) => {} + ClientboundGamePacket::DisguisedChat(_) => {} + ClientboundGamePacket::UpdateEnabledFeatures(_) => {} + ClientboundGamePacket::ContainerClose(_) => {} } } } diff --git a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs index 64875741..75f3f4dc 100755 --- a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs @@ -46,7 +46,7 @@ impl ClientboundAddEntityPacket { } /// Apply the default metadata for the given entity. - pub fn apply_metadata(&self, entity: &mut bevy_ecs::world::EntityMut) { + pub fn apply_metadata(&self, entity: &mut bevy_ecs::system::EntityCommands) { apply_default_metadata(entity, self.entity_type); } } diff --git a/azalea-world/src/entity/metadata.rs b/azalea-world/src/entity/metadata.rs index fbcf83a6..fe771fb2 100644 --- a/azalea-world/src/entity/metadata.rs +++ b/azalea-world/src/entity/metadata.rs @@ -79,7 +79,7 @@ pub struct CanDuplicate(pub bool); pub struct Allay; impl Allay { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -160,7 +160,7 @@ pub struct Waiting(pub bool); pub struct AreaEffectCloud; impl AreaEffectCloud { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -245,7 +245,7 @@ pub struct RightLegPose(pub Rotations); pub struct ArmorStand; impl ArmorStand { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -356,7 +356,7 @@ pub struct ArrowEffectColor(pub i32); pub struct Arrow; impl Arrow { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -431,7 +431,7 @@ pub struct AxolotlFromBucket(pub bool); pub struct Axolotl; impl Axolotl { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -520,7 +520,7 @@ pub struct Resting(pub bool); pub struct Bat; impl Bat { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -596,7 +596,7 @@ pub struct BeeRemainingAngerTime(pub i32); pub struct Bee; impl Bee { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -687,7 +687,7 @@ pub struct Charged(pub bool); pub struct Blaze; impl Blaze { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -775,7 +775,7 @@ pub struct BubbleTime(pub i32); pub struct Boat; impl Boat { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -871,7 +871,7 @@ pub struct LastPoseChangeTick(pub i64); pub struct Camel; impl Camel { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -990,7 +990,7 @@ pub struct CatCollarColor(pub i32); pub struct Cat; impl Cat { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1090,7 +1090,7 @@ pub struct Climbing(pub bool); pub struct CaveSpider; impl CaveSpider { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1162,7 +1162,7 @@ impl Default for CaveSpiderMetadataBundle { pub struct ChestBoat; impl ChestBoat { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1229,7 +1229,7 @@ pub struct CustomDisplay(pub bool); pub struct ChestMinecart; impl ChestMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1283,7 +1283,7 @@ impl Default for ChestMinecartMetadataBundle { pub struct Chicken; impl Chicken { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1357,7 +1357,7 @@ pub struct CodFromBucket(pub bool); pub struct Cod; impl Cod { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1431,7 +1431,7 @@ pub struct LastOutput(pub FormattedText); pub struct CommandBlockMinecart; impl CommandBlockMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1495,7 +1495,7 @@ impl Default for CommandBlockMinecartMetadataBundle { pub struct Cow; impl Cow { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1573,7 +1573,7 @@ pub struct IsIgnited(pub bool); pub struct Creeper; impl Creeper { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1662,7 +1662,7 @@ pub struct MoistnessLevel(pub i32); pub struct Dolphin; impl Dolphin { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1756,7 +1756,7 @@ pub struct DonkeyChest(pub bool); pub struct Donkey; impl Donkey { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1856,7 +1856,7 @@ impl Default for DonkeyMetadataBundle { pub struct DragonFireball; impl DragonFireball { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1907,7 +1907,7 @@ pub struct DrownedConversion(pub bool); pub struct Drowned; impl Drowned { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -1983,7 +1983,7 @@ pub struct EggItemStack(pub Slot); pub struct Egg; impl Egg { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2037,7 +2037,7 @@ pub struct AttackTarget(pub i32); pub struct ElderGuardian; impl ElderGuardian { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2114,7 +2114,7 @@ pub struct ShowBottom(pub bool); pub struct EndCrystal; impl EndCrystal { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2171,7 +2171,7 @@ pub struct Phase(pub i32); pub struct EnderDragon; impl EnderDragon { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2240,7 +2240,7 @@ pub struct EnderPearlItemStack(pub Slot); pub struct EnderPearl; impl EnderPearl { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2296,7 +2296,7 @@ pub struct StaredAt(pub bool); pub struct Enderman; impl Enderman { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2379,7 +2379,7 @@ impl Default for EndermanMetadataBundle { pub struct Endermite; impl Endermite { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2451,7 +2451,7 @@ pub struct EvokerSpellCasting(pub u8); pub struct Evoker; impl Evoker { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2529,7 +2529,7 @@ impl Default for EvokerMetadataBundle { pub struct EvokerFangs; impl EvokerFangs { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2576,7 +2576,7 @@ pub struct ExperienceBottleItemStack(pub Slot); pub struct ExperienceBottle; impl ExperienceBottle { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2626,7 +2626,7 @@ impl Default for ExperienceBottleMetadataBundle { pub struct ExperienceOrb; impl ExperienceOrb { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2673,7 +2673,7 @@ pub struct EyeOfEnderItemStack(pub Slot); pub struct EyeOfEnder; impl EyeOfEnder { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2725,7 +2725,7 @@ pub struct StartPos(pub BlockPos); pub struct FallingBlock; impl FallingBlock { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2777,7 +2777,7 @@ pub struct FireballItemStack(pub Slot); pub struct Fireball; impl Fireball { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2833,7 +2833,7 @@ pub struct ShotAtAngle(pub bool); pub struct FireworkRocket; impl FireworkRocket { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2897,7 +2897,7 @@ pub struct Biting(pub bool); pub struct FishingBobber; impl FishingBobber { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -2970,7 +2970,7 @@ pub struct TrustedId1(pub Option); pub struct Fox; impl Fox { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3082,7 +3082,7 @@ pub struct TongueTarget(pub OptionalUnsignedInt); pub struct Frog; impl Frog { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3166,7 +3166,7 @@ pub struct Fuel(pub bool); pub struct FurnaceMinecart; impl FurnaceMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3227,7 +3227,7 @@ pub struct IsCharging(pub bool); pub struct Ghast; impl Ghast { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3294,7 +3294,7 @@ impl Default for GhastMetadataBundle { pub struct Giant; impl Giant { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3366,7 +3366,7 @@ pub struct Rotation(pub i32); pub struct GlowItemFrame; impl GlowItemFrame { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3418,7 +3418,7 @@ pub struct DarkTicksRemaining(pub i32); pub struct GlowSquid; impl GlowSquid { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3497,7 +3497,7 @@ pub struct HasRightHorn(pub bool); pub struct Goat; impl Goat { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3584,7 +3584,7 @@ impl Default for GoatMetadataBundle { pub struct Guardian; impl Guardian { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3664,7 +3664,7 @@ pub struct HoglinImmuneToZombification(pub bool); pub struct Hoglin; impl Hoglin { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3741,7 +3741,7 @@ impl Default for HoglinMetadataBundle { pub struct HopperMinecart; impl HopperMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3809,7 +3809,7 @@ pub struct HorseTypeVariant(pub i32); pub struct Horse; impl Horse { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3909,7 +3909,7 @@ impl Default for HorseMetadataBundle { pub struct Husk; impl Husk { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -3987,7 +3987,7 @@ pub struct IllusionerSpellCasting(pub u8); pub struct Illusioner; impl Illusioner { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4067,7 +4067,7 @@ pub struct PlayerCreated(pub bool); pub struct IronGolem; impl IronGolem { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4140,7 +4140,7 @@ pub struct ItemItem(pub Slot); pub struct Item; impl Item { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4190,7 +4190,7 @@ impl Default for ItemMetadataBundle { pub struct ItemFrame; impl ItemFrame { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4245,7 +4245,7 @@ impl Default for ItemFrameMetadataBundle { pub struct LeashKnot; impl LeashKnot { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4290,7 +4290,7 @@ impl Default for LeashKnotMetadataBundle { pub struct LightningBolt; impl LightningBolt { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4355,7 +4355,7 @@ pub struct LlamaVariant(pub i32); pub struct Llama; impl Llama { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4470,7 +4470,7 @@ impl Default for LlamaMetadataBundle { pub struct LlamaSpit; impl LlamaSpit { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4517,7 +4517,7 @@ pub struct SlimeSize(pub i32); pub struct MagmaCube; impl MagmaCube { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4583,7 +4583,7 @@ impl Default for MagmaCubeMetadataBundle { pub struct Marker; impl Marker { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4628,7 +4628,7 @@ impl Default for MarkerMetadataBundle { pub struct Minecart; impl Minecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4684,7 +4684,7 @@ pub struct MooshroomKind(pub String); pub struct Mooshroom; impl Mooshroom { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4778,7 +4778,7 @@ pub struct MuleChest(pub bool); pub struct Mule; impl Mule { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4880,7 +4880,7 @@ pub struct Trusting(pub bool); pub struct Ocelot; impl Ocelot { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -4959,7 +4959,7 @@ pub struct PaintingVariant(pub azalea_registry::PaintingVariant); pub struct Painting; impl Painting { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5027,7 +5027,7 @@ pub struct PandaFlags(pub u8); pub struct Panda; impl Panda { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5141,7 +5141,7 @@ pub struct ParrotVariant(pub i32); pub struct Parrot; impl Parrot { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5226,7 +5226,7 @@ pub struct PhantomSize(pub i32); pub struct Phantom; impl Phantom { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5297,7 +5297,7 @@ pub struct PigBoostTime(pub i32); pub struct Pig; impl Pig { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5387,7 +5387,7 @@ pub struct IsDancing(pub bool); pub struct Piglin; impl Piglin { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5477,7 +5477,7 @@ pub struct PiglinBruteImmuneToZombification(pub bool); pub struct PiglinBrute; impl PiglinBrute { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5554,7 +5554,7 @@ pub struct PillagerIsChargingCrossbow(pub bool); pub struct Pillager; impl Pillager { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5644,7 +5644,7 @@ pub struct ShoulderRight(pub azalea_nbt::Tag); pub struct Player; impl Player { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5732,7 +5732,7 @@ pub struct PolarBearStanding(pub bool); pub struct PolarBear; impl PolarBear { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5811,7 +5811,7 @@ pub struct PotionItemStack(pub Slot); pub struct Potion; impl Potion { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5865,7 +5865,7 @@ pub struct PuffState(pub i32); pub struct Pufferfish; impl Pufferfish { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -5942,7 +5942,7 @@ pub struct RabbitKind(pub i32); pub struct Rabbit; impl Rabbit { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6021,7 +6021,7 @@ pub struct RavagerIsCelebrating(pub bool); pub struct Ravager; impl Ravager { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6096,7 +6096,7 @@ pub struct SalmonFromBucket(pub bool); pub struct Salmon; impl Salmon { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6168,7 +6168,7 @@ pub struct Sheared(pub bool); pub struct Sheep; impl Sheep { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6252,7 +6252,7 @@ pub struct ShulkerColor(pub u8); pub struct Shulker; impl Shulker { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6332,7 +6332,7 @@ impl Default for ShulkerMetadataBundle { pub struct ShulkerBullet; impl ShulkerBullet { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6377,7 +6377,7 @@ impl Default for ShulkerBulletMetadataBundle { pub struct Silverfish; impl Silverfish { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6447,7 +6447,7 @@ pub struct StrayConversion(pub bool); pub struct Skeleton; impl Skeleton { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6532,7 +6532,7 @@ pub struct SkeletonHorseOwnerUuid(pub Option); pub struct SkeletonHorse; impl SkeletonHorse { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6627,7 +6627,7 @@ impl Default for SkeletonHorseMetadataBundle { pub struct Slime; impl Slime { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6696,7 +6696,7 @@ pub struct SmallFireballItemStack(pub Slot); pub struct SmallFireball; impl SmallFireball { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6748,7 +6748,7 @@ pub struct HasPumpkin(pub bool); pub struct SnowGolem; impl SnowGolem { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6821,7 +6821,7 @@ pub struct SnowballItemStack(pub Slot); pub struct Snowball; impl Snowball { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6871,7 +6871,7 @@ impl Default for SnowballMetadataBundle { pub struct SpawnerMinecart; impl SpawnerMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6933,7 +6933,7 @@ pub struct SpectralArrowPierceLevel(pub u8); pub struct SpectralArrow; impl SpectralArrow { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -6995,7 +6995,7 @@ impl Default for SpectralArrowMetadataBundle { pub struct Spider; impl Spider { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7069,7 +7069,7 @@ impl Default for SpiderMetadataBundle { pub struct Squid; impl Squid { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7134,7 +7134,7 @@ impl Default for SquidMetadataBundle { pub struct Stray; impl Stray { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7208,7 +7208,7 @@ pub struct StriderSaddle(pub bool); pub struct Strider; impl Strider { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7297,7 +7297,7 @@ pub struct TadpoleFromBucket(pub bool); pub struct Tadpole; impl Tadpole { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7369,7 +7369,7 @@ pub struct Fuse(pub i32); pub struct Tnt; impl Tnt { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7419,7 +7419,7 @@ impl Default for TntMetadataBundle { pub struct TntMinecart; impl TntMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7473,7 +7473,7 @@ impl Default for TntMinecartMetadataBundle { pub struct TraderLlama; impl TraderLlama { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7570,7 +7570,7 @@ pub struct Foil(pub bool); pub struct Trident; impl Trident { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7646,7 +7646,7 @@ pub struct TropicalFishTypeVariant(pub i32); pub struct TropicalFish; impl TropicalFish { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7733,7 +7733,7 @@ pub struct Travelling(pub bool); pub struct Turtle; impl Turtle { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7837,7 +7837,7 @@ pub struct VexFlags(pub u8); pub struct Vex; impl Vex { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7914,7 +7914,7 @@ pub struct VillagerVillagerData(pub VillagerData); pub struct Villager; impl Villager { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -7999,7 +7999,7 @@ pub struct VindicatorIsCelebrating(pub bool); pub struct Vindicator; impl Vindicator { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8074,7 +8074,7 @@ pub struct WanderingTraderUnhappyCounter(pub i32); pub struct WanderingTrader; impl WanderingTrader { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8150,7 +8150,7 @@ pub struct ClientAngerLevel(pub i32); pub struct Warden; impl Warden { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8227,7 +8227,7 @@ pub struct WitchUsingItem(pub bool); pub struct Witch; impl Witch { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8313,7 +8313,7 @@ pub struct Inv(pub i32); pub struct Wither; impl Wither { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8401,7 +8401,7 @@ impl Default for WitherMetadataBundle { pub struct WitherSkeleton; impl WitherSkeleton { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8471,7 +8471,7 @@ pub struct Dangerous(pub bool); pub struct WitherSkull; impl WitherSkull { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8527,7 +8527,7 @@ pub struct WolfRemainingAngerTime(pub i32); pub struct Wolf; impl Wolf { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8622,7 +8622,7 @@ pub struct ZoglinBaby(pub bool); pub struct Zoglin; impl Zoglin { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8695,7 +8695,7 @@ impl Default for ZoglinMetadataBundle { pub struct Zombie; impl Zombie { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8790,7 +8790,7 @@ pub struct ZombieHorseOwnerUuid(pub Option); pub struct ZombieHorse; impl ZombieHorse { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8889,7 +8889,7 @@ pub struct ZombieVillagerVillagerData(pub VillagerData); pub struct ZombieVillager; impl ZombieVillager { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -8977,7 +8977,7 @@ impl Default for ZombieVillagerMetadataBundle { pub struct ZombifiedPiglin; impl ZombifiedPiglin { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9051,7 +9051,7 @@ impl Default for ZombifiedPiglinMetadataBundle { pub struct AbstractAgeable; impl AbstractAgeable { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9121,7 +9121,7 @@ impl Default for AbstractAgeableMetadataBundle { pub struct AbstractAnimal; impl AbstractAnimal { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9190,7 +9190,7 @@ impl Default for AbstractAnimalMetadataBundle { pub struct AbstractCreature; impl AbstractCreature { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9252,7 +9252,7 @@ impl Default for AbstractCreatureMetadataBundle { pub struct AbstractEntity; impl AbstractEntity { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9337,7 +9337,7 @@ impl Default for AbstractEntityMetadataBundle { pub struct AbstractInsentient; impl AbstractInsentient { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9405,7 +9405,7 @@ impl Default for AbstractInsentientMetadataBundle { pub struct AbstractLiving; impl AbstractLiving { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9489,7 +9489,7 @@ impl Default for AbstractLivingMetadataBundle { pub struct AbstractMinecart; impl AbstractMinecart { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9564,7 +9564,7 @@ impl Default for AbstractMinecartMetadataBundle { pub struct AbstractMonster; impl AbstractMonster { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9629,7 +9629,7 @@ impl Default for AbstractMonsterMetadataBundle { pub struct AbstractTameable; impl AbstractTameable { pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { @@ -9712,11 +9712,11 @@ impl Default for AbstractTameableMetadataBundle { } pub fn apply_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, + entity_kind: azalea_registry::EntityKind, items: Vec, ) -> Result<(), UpdateMetadataError> { - let entity_kind = entity.get::().unwrap(); - match **entity_kind { + match entity_kind { azalea_registry::EntityKind::Allay => { for d in items { Allay::apply_metadata(entity, d)?; @@ -10317,7 +10317,7 @@ pub fn apply_metadata( } pub fn apply_default_metadata( - entity: &mut bevy_ecs::world::EntityMut, + entity: &mut bevy_ecs::system::EntityCommands, kind: azalea_registry::EntityKind, ) { match kind { diff --git a/codegen/lib/code/entity.py b/codegen/lib/code/entity.py index 7c041d91..4962400d 100644 --- a/codegen/lib/code/entity.py +++ b/codegen/lib/code/entity.py @@ -183,7 +183,7 @@ impl From for UpdateMetadataError { # impl Allay { # pub fn apply_metadata( - # entity: &mut bevy_ecs::world::EntityMut, + # entity: &mut bevy_ecs::system::EntityCommands, # d: EntityDataItem, # ) -> Result<(), UpdateMetadataError> { # match d.index { @@ -196,7 +196,7 @@ impl From for UpdateMetadataError { # } code.append(f'impl {struct_name} {{') code.append( - f' pub fn apply_metadata(entity: &mut bevy_ecs::world::EntityMut, d: EntityDataItem) -> Result<(), UpdateMetadataError> {{') + f' pub fn apply_metadata(entity: &mut bevy_ecs::system::EntityCommands, d: EntityDataItem) -> Result<(), UpdateMetadataError> {{') code.append(f' match d.index {{') parent_last_index = -1 @@ -400,7 +400,7 @@ impl From for UpdateMetadataError { # and now make the main apply_metadata # pub fn apply_metadata( - # entity: &mut bevy_ecs::world::EntityMut, + # entity: &mut bevy_ecs::system::EntityCommands, # items: Vec, # ) -> Result<(), UpdateMetadataError> { # if entity.contains::() { @@ -413,10 +413,12 @@ impl From for UpdateMetadataError { # Ok(()) # } code.append( - f'pub fn apply_metadata(entity: &mut bevy_ecs::world::EntityMut, items: Vec) -> Result<(), UpdateMetadataError> {{') - code.append( - ' let entity_kind = entity.get::().unwrap();') - code.append(' match **entity_kind {') + f'''pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + entity_kind: azalea_registry::EntityKind, + items: Vec, +) -> Result<(), UpdateMetadataError> {{ + match entity_kind {{''') for entity_id in burger_entity_data: if entity_id.startswith('~'): # not actually an entity @@ -434,7 +436,7 @@ impl From for UpdateMetadataError { code.append('}') code.append('') - # pub fn apply_default_metadata(entity: &mut bevy_ecs::world::EntityMut, kind: azalea_registry::EntityKind) { + # pub fn apply_default_metadata(entity: &mut bevy_ecs::system::EntityCommands, kind: azalea_registry::EntityKind) { # match kind { # azalea_registry::EntityKind::AreaEffectCloud => { # entity.insert(AreaEffectCloudMetadataBundle::default()); @@ -442,7 +444,7 @@ impl From for UpdateMetadataError { # } # } code.append( - 'pub fn apply_default_metadata(entity: &mut bevy_ecs::world::EntityMut, kind: azalea_registry::EntityKind) {') + 'pub fn apply_default_metadata(entity: &mut bevy_ecs::system::EntityCommands, kind: azalea_registry::EntityKind) {') code.append(' match kind {') for entity_id in burger_entity_data: if entity_id.startswith('~'):