pub struct EntityTracker {
entities: HashMap<i32, TrackedEntity>,
}Expand description
World-level entity tracker.
Fields§
§entities: HashMap<i32, TrackedEntity>Maps entity ID to its tracking data.
Implementations§
Source§impl EntityTracker
impl EntityTracker
Sourcepub fn add(
&self,
entity: &SharedEntity,
get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>,
get_player: impl Fn(i32) -> Option<Arc<Player>>,
)
pub fn add( &self, entity: &SharedEntity, get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>, get_player: impl Fn(i32) -> Option<Arc<Player>>, )
Starts tracking an entity.
Sends spawn packets to players already watching the entity chunk and inside the vanilla tracking range.
The get_players_in_chunk callback should return player IDs in a given chunk
(typically from PlayerAreaMap::get_tracking_players).
The get_player callback should resolve a player ID to a Player reference.
§Panics
Panics if the entity is removed or is already tracked.
Sourcepub fn remove(
&self,
entity_id: i32,
get_player: impl Fn(i32) -> Option<Arc<Player>>,
)
pub fn remove( &self, entity_id: i32, get_player: impl Fn(i32) -> Option<Arc<Player>>, )
Stops tracking an entity and sends despawn to all tracking players.
Sourcepub fn update_player(
&self,
player: &Player,
view: &PlayerChunkView,
is_chunk_sent: impl Fn(ChunkPos) -> bool,
)
pub fn update_player( &self, player: &Player, view: &PlayerChunkView, is_chunk_sent: impl Fn(ChunkPos) -> bool, )
Refreshes the tracked-entity set for one player.
Mirrors vanilla TrackedEntity.updatePlayer: each tracked entity checks
whether the player tracks the entity chunk, passes the entity-specific
broadcast predicate, and is inside the effective horizontal range.
Sourcepub fn send_changes<Movement, SelfMovement, EntityData, Attributes, MobEffects, Equipment, Passengers, EntityLink>(
&self,
get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>,
get_player: impl Fn(i32) -> Option<Arc<Player>>,
senders: EntityChangeSenders<Movement, SelfMovement, EntityData, Attributes, MobEffects, Equipment, Passengers, EntityLink>,
)where
Movement: FnMut(i32, EntityMovementSyncPacket),
SelfMovement: FnMut(i32, EntityMovementSyncPacket),
EntityData: FnMut(i32, Vec<DataValue>),
Attributes: FnMut(i32, Vec<AttributeSnapshot>),
MobEffects: FnMut(i32, MobEffectSyncPacket),
Equipment: FnMut(i32, CSetEquipment),
Passengers: FnMut(i32, CSetPassengers),
EntityLink: FnMut(i32, CSetEntityLink),
pub fn send_changes<Movement, SelfMovement, EntityData, Attributes, MobEffects, Equipment, Passengers, EntityLink>(
&self,
get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>,
get_player: impl Fn(i32) -> Option<Arc<Player>>,
senders: EntityChangeSenders<Movement, SelfMovement, EntityData, Attributes, MobEffects, Equipment, Passengers, EntityLink>,
)where
Movement: FnMut(i32, EntityMovementSyncPacket),
SelfMovement: FnMut(i32, EntityMovementSyncPacket),
EntityData: FnMut(i32, Vec<DataValue>),
Attributes: FnMut(i32, Vec<AttributeSnapshot>),
MobEffects: FnMut(i32, MobEffectSyncPacket),
Equipment: FnMut(i32, CSetEquipment),
Passengers: FnMut(i32, CSetPassengers),
EntityLink: FnMut(i32, CSetEntityLink),
Sends tracker-owned movement changes for all tracked entities.
Mirrors vanilla ChunkMap.tick driving ServerEntity.sendChanges.
Sourcepub fn on_player_leave(&self, player_id: i32)
pub fn on_player_leave(&self, player_id: i32)
Called when a player leaves - removes them from all entity tracking.
Sourcepub fn on_entity_section_change(
&self,
entity_id: i32,
old_chunk: ChunkPos,
new_chunk: ChunkPos,
get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>,
get_player: impl Fn(i32) -> Option<Arc<Player>>,
)
pub fn on_entity_section_change( &self, entity_id: i32, old_chunk: ChunkPos, new_chunk: ChunkPos, get_players_in_chunk: impl Fn(ChunkPos) -> Vec<i32>, get_player: impl Fn(i32) -> Option<Arc<Player>>, )
Updates an entity’s current chunk and visible players after a section move.
Vanilla refreshes tracked players when an entity’s section position changes. The old and new chunks may be the same for purely vertical section moves.
fn refresh_entity_players( &self, entity_id: i32, get_players_in_chunk: &impl Fn(ChunkPos) -> Vec<i32>, get_player: &impl Fn(i32) -> Option<Arc<Player>>, )
Sourcepub fn tracking_player_ids(&self, entity_id: i32) -> Vec<i32>
pub fn tracking_player_ids(&self, entity_id: i32) -> Vec<i32>
Returns players currently tracking an entity.
fn remove_dead_entity(&self, entity_id: i32)
fn visible_players_for_entity( entity_id: i32, entity: &dyn Entity, entity_chunk: ChunkPos, tracking_range: EntityTrackingRange, get_players_in_chunk: &impl Fn(ChunkPos) -> Vec<i32>, get_player: &impl Fn(i32) -> Option<Arc<Player>>, ) -> FxHashSet<i32>
fn send_spawn_packets(&self, entity: &SharedEntity, player: &Player)
fn spawn_pairing( &self, entity: &SharedEntity, player_id: i32, ) -> EntitySpawnPairing
fn passenger_pairing_packets_for_player( &self, entity: &dyn Entity, player_id: i32, ) -> Vec<CSetPassengers>
fn vehicle_passenger_packet_for_player( &self, entity: &dyn Entity, player_id: i32, ) -> Option<CSetPassengers>
fn direct_tracked_passenger_ids(&self, entity: &dyn Entity) -> Vec<i32>
fn direct_passenger_ids_seen_by_player( &self, entity: &dyn Entity, player_id: i32, ) -> Vec<i32>
fn is_entity_tracked(&self, entity_id: i32) -> bool
fn entity_seen_by_player(&self, entity_id: i32, player_id: i32) -> bool
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for EntityTracker
impl !UnwindSafe for EntityTracker
impl RefUnwindSafe for EntityTracker
impl Send for EntityTracker
impl Sync for EntityTracker
impl Unpin for EntityTracker
impl UnsafeUnpin for EntityTracker
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreArc<SyncMutex<>>