mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 14:26:04 +00:00
try to make entity_by work
well it does work but i couldn't figure out how to make it look not terrible. Will hopefully change in the future
This commit is contained in:
parent
a971a30fd1
commit
8921ae4887
3 changed files with 73 additions and 55 deletions
|
@ -1,5 +1,11 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use azalea_world::entity::Entity;
|
use azalea_world::entity::Entity;
|
||||||
use bevy_ecs::query::{ReadOnlyWorldQuery, WorldQuery};
|
use bevy_ecs::{
|
||||||
|
prelude::Component,
|
||||||
|
query::{QueryItem, ROQueryItem, ReadOnlyWorldQuery, WorldQuery},
|
||||||
|
};
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
|
||||||
use crate::Client;
|
use crate::Client;
|
||||||
|
|
||||||
|
@ -14,44 +20,51 @@ impl Client {
|
||||||
.expect("Our client is missing a required component.")
|
.expect("Our client is missing a required component.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// /// Return a lightweight [`Entity`] for the entity that matches the given
|
/// Return a lightweight [`Entity`] for the entity that matches the given
|
||||||
// /// predicate function.
|
/// predicate function.
|
||||||
// ///
|
///
|
||||||
// /// You can then use [`Self::map_entity`] to get components from this
|
/// You can then use [`Self::map_entity`] to get components from this
|
||||||
// /// entity.
|
/// entity.
|
||||||
// pub fn entity_by<'a, F: ReadOnlyWorldQuery, Q: ReadOnlyWorldQuery>(
|
pub fn entity_by<F: ReadOnlyWorldQuery, Q: ReadOnlyWorldQuery>(
|
||||||
// &mut self,
|
&mut self,
|
||||||
// mut predicate: impl EntityPredicate<'a, Q>,
|
predicate: impl EntityPredicate<Q, F>,
|
||||||
// ) -> Option<Entity> {
|
) -> Option<Entity> {
|
||||||
// let mut ecs = self.ecs.lock();
|
predicate.find(self.ecs.clone())
|
||||||
// let mut query = ecs.query_filtered::<(Entity, Q), F>();
|
}
|
||||||
// let entity = query
|
|
||||||
// .iter_mut(&mut ecs)
|
|
||||||
// .find(|(_, q)| predicate.matches(q))
|
|
||||||
// .map(|(entity, _)| entity);
|
|
||||||
// entity
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait EntityPredicate<'a, Q: ReadOnlyWorldQuery> {
|
pub trait EntityPredicate<Q: ReadOnlyWorldQuery, Filter: ReadOnlyWorldQuery> {
|
||||||
fn matches(&self, components: &<Q as WorldQuery>::Item<'a>) -> bool;
|
fn find(&self, ecs_lock: Arc<Mutex<bevy_ecs::world::World>>) -> Option<Entity>;
|
||||||
}
|
}
|
||||||
// impl<'a, F, Q> EntityPredicate<'a, Q> for F
|
impl<'a, F, Q, Filter> EntityPredicate<(Q,), Filter> for F
|
||||||
// where
|
where
|
||||||
// F: Fn(Q) -> bool,
|
F: Fn(&ROQueryItem<Q>) -> bool,
|
||||||
// Q: ReadOnlyWorldQuery,
|
Q: ReadOnlyWorldQuery,
|
||||||
// {
|
Filter: ReadOnlyWorldQuery,
|
||||||
// fn matches(&self, query: &<Q as WorldQuery>::Item<'a>) -> bool {
|
{
|
||||||
// (self)(query)
|
fn find(&self, ecs_lock: Arc<Mutex<bevy_ecs::world::World>>) -> Option<Entity> {
|
||||||
// }
|
let mut ecs = ecs_lock.lock();
|
||||||
// }
|
let mut query = ecs.query_filtered::<(Entity, Q), Filter>();
|
||||||
|
let entity = query.iter(&ecs).find(|(_, q)| (self)(q)).map(|(e, _)| e);
|
||||||
|
|
||||||
|
entity.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// impl<'a, F, Q1, Q2> EntityPredicate<'a, (Q1, Q2)> for F
|
// impl<'a, F, Q1, Q2> EntityPredicate<'a, (Q1, Q2)> for F
|
||||||
// where
|
// where
|
||||||
// F: Fn(Q1, Q2) -> bool,
|
// F: Fn(&<Q1 as WorldQuery>::Item<'_>, &<Q2 as WorldQuery>::Item<'_>) ->
|
||||||
// Q1: WorldQuery<Item<'a> = Q1>,
|
// bool, Q1: ReadOnlyWorldQuery,
|
||||||
// Q2: WorldQuery<Item<'a> = Q2>,
|
// Q2: ReadOnlyWorldQuery,
|
||||||
// {
|
// {
|
||||||
// fn matches(&self, query: <(Q1, Q2) as WorldQuery>::Item<'_>) -> bool {
|
// fn find(&self, ecs: &mut bevy_ecs::world::World) -> Option<Entity> {
|
||||||
// (self)(query.0, query.1)
|
// // (self)(query)
|
||||||
|
// let mut query = ecs.query_filtered::<(Entity, Q1, Q2), ()>();
|
||||||
|
// let entity = query
|
||||||
|
// .iter(ecs)
|
||||||
|
// .find(|(_, q1, q2)| (self)(q1, q2))
|
||||||
|
// .map(|(e, _, _)| e);
|
||||||
|
|
||||||
|
// entity
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
#![feature(trait_upcasting)]
|
#![feature(trait_upcasting)]
|
||||||
#![feature(error_generic_member_access)]
|
#![feature(error_generic_member_access)]
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
mod account;
|
mod account;
|
||||||
mod chat;
|
mod chat;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
use azalea::ecs::query::With;
|
use azalea::ecs::query::With;
|
||||||
use azalea::entity::metadata::Player;
|
use azalea::entity::metadata::Player;
|
||||||
|
use azalea::entity::Position;
|
||||||
use azalea::pathfinder::BlockPosGoal;
|
use azalea::pathfinder::BlockPosGoal;
|
||||||
// use azalea::ClientInformation;
|
// use azalea::ClientInformation;
|
||||||
use azalea::{prelude::*, BlockPos, Swarm, SwarmEvent, WalkDirection};
|
use azalea::{prelude::*, BlockPos, Swarm, SwarmEvent, WalkDirection};
|
||||||
|
@ -92,7 +95,7 @@ async fn handle(mut bot: Client, event: Event, _state: State) -> anyhow::Result<
|
||||||
let Some(sender) = m.username() else {
|
let Some(sender) = m.username() else {
|
||||||
return Ok(())
|
return Ok(())
|
||||||
};
|
};
|
||||||
let mut ecs = bot.ecs.lock();
|
// let mut ecs = bot.ecs.lock();
|
||||||
// let entity = bot
|
// let entity = bot
|
||||||
// .ecs
|
// .ecs
|
||||||
// .lock()
|
// .lock()
|
||||||
|
@ -100,27 +103,28 @@ async fn handle(mut bot: Client, event: Event, _state: State) -> anyhow::Result<
|
||||||
// .iter(&mut ecs)
|
// .iter(&mut ecs)
|
||||||
// .find(|e| e.name() == Some(sender));
|
// .find(|e| e.name() == Some(sender));
|
||||||
// let entity = bot.entity_by::<With<Player>>(|name: &Name| name == sender);
|
// let entity = bot.entity_by::<With<Player>>(|name: &Name| name == sender);
|
||||||
let entity = bot.entity_by(|name: &Name| name == sender);
|
// let entity = bot.entity_by(|name: &Name| name == sender);
|
||||||
|
let entity = bot.entity_by::<With<Player>, (&Position,)>(|pos: &&Position| true);
|
||||||
if let Some(entity) = entity {
|
if let Some(entity) = entity {
|
||||||
if m.content() == "goto" {
|
// if m.content() == "goto" {
|
||||||
let target_pos_vec3 = entity.pos();
|
// let target_pos_vec3 = entity.pos();
|
||||||
let target_pos: BlockPos = target_pos_vec3.into();
|
// let target_pos: BlockPos = target_pos_vec3.into();
|
||||||
bot.goto(BlockPosGoal::from(target_pos));
|
// bot.goto(BlockPosGoal::from(target_pos));
|
||||||
} else if m.content() == "look" {
|
// } else if m.content() == "look" {
|
||||||
let target_pos_vec3 = entity.pos();
|
// let target_pos_vec3 = entity.pos();
|
||||||
let target_pos: BlockPos = target_pos_vec3.into();
|
// let target_pos: BlockPos = target_pos_vec3.into();
|
||||||
println!("target_pos: {:?}", target_pos);
|
// println!("target_pos: {:?}", target_pos);
|
||||||
bot.look_at(target_pos.center());
|
// bot.look_at(target_pos.center());
|
||||||
} else if m.content() == "jump" {
|
// } else if m.content() == "jump" {
|
||||||
bot.set_jumping(true);
|
// bot.set_jumping(true);
|
||||||
} else if m.content() == "walk" {
|
// } else if m.content() == "walk" {
|
||||||
bot.walk(WalkDirection::Forward);
|
// bot.walk(WalkDirection::Forward);
|
||||||
} else if m.content() == "stop" {
|
// } else if m.content() == "stop" {
|
||||||
bot.set_jumping(false);
|
// bot.set_jumping(false);
|
||||||
bot.walk(WalkDirection::None);
|
// bot.walk(WalkDirection::None);
|
||||||
} else if m.content() == "lag" {
|
// } else if m.content() == "lag" {
|
||||||
std::thread::sleep(Duration::from_millis(1000));
|
// std::thread::sleep(Duration::from_millis(1000));
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Death(_) => {
|
Event::Death(_) => {
|
||||||
|
|
Loading…
Add table
Reference in a new issue