pub struct OminousItemSpawnerItem(pub ItemStack);Expand description
A metadata field for OminousItemSpawner.
Tuple Fields§
§0: ItemStackMethods from Deref<Target = ItemStack>§
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Check if the slot is ItemStack::Empty, if the count is <= 0, or if the item is air.
This is the opposite of ItemStack::is_present.
Sourcepub fn is_present(&self) -> bool
pub fn is_present(&self) -> bool
Check if the slot is not ItemStack::Empty, if the count is > 0, and if the item is not air.
This is the opposite of ItemStack::is_empty.
Sourcepub fn count(&self) -> i32
pub fn count(&self) -> i32
Return the amount of the item in the slot, or 0 if the slot is empty.
Note that it’s possible for the count to be zero or negative when the slot is present.
Sourcepub fn split(&mut self, count: u32) -> ItemStack
pub fn split(&mut self, count: u32) -> ItemStack
Remove count items from this slot, returning the removed items.
Sourcepub fn kind(&self) -> ItemKind
pub fn kind(&self) -> ItemKind
Get the kind of the item in this slot, or ItemKind::Air
Examples found in repository?
63fn log_nearby_item_drops(
64 bots: Query<Entity, With<Bot>>,
65 entities: EntityFinder<With<ItemItem>>,
66 item_drops: Query<&ItemItem>,
67) {
68 for bot_id in bots.iter() {
69 for (entity, distance) in entities.nearby_entities_to_entity(bot_id, 8.0) {
70 let item_drop = item_drops.get(entity).unwrap();
71 let kind = item_drop.kind();
72
73 println!("Bot {bot_id:?} can see an {kind:?} {distance:.1} meters away.");
74 }
75 }
76}Sourcepub fn update_empty(&mut self)
pub fn update_empty(&mut self)
Update whether this slot is empty, based on the count.
Sourcepub fn as_present(&self) -> Option<&ItemStackData>
pub fn as_present(&self) -> Option<&ItemStackData>
Convert this slot into an ItemStackData, if it’s present.
pub fn as_present_mut(&mut self) -> Option<&mut ItemStackData>
Sourcepub fn get_component<'a, T>(&'a self) -> Option<Cow<'a, T>>where
T: DataComponentTrait,
pub fn get_component<'a, T>(&'a self) -> Option<Cow<'a, T>>where
T: DataComponentTrait,
Get the value of a data component for this item.
This is used for things like getting the damage of an item, or seeing how much food it replenishes.
Examples found in repository?
22pub fn register(commands: &mut CommandDispatcher<Mutex<CommandSource>>) {
23 commands.register(literal("ping").executes(|ctx: &Ctx| {
24 let source = ctx.source.lock();
25 source.reply("pong!");
26 1
27 }));
28
29 commands.register(literal("disconnect").executes(|ctx: &Ctx| {
30 let source = ctx.source.lock();
31 source.bot.disconnect();
32 1
33 }));
34
35 commands.register(literal("whereami").executes(|ctx: &Ctx| {
36 let mut source = ctx.source.lock();
37 let Some(entity) = source.entity() else {
38 source.reply("You aren't in render distance!");
39 return 0;
40 };
41 let position = entity.position();
42 source.reply(format!(
43 "You are at {}, {}, {}",
44 position.x, position.y, position.z
45 ));
46 1
47 }));
48
49 commands.register(literal("entityid").executes(|ctx: &Ctx| {
50 let mut source = ctx.source.lock();
51 let Some(entity) = source.entity() else {
52 source.reply("You aren't in render distance!");
53 return 0;
54 };
55 let entity_id = entity.minecraft_id();
56 source.reply(format!(
57 "Your Minecraft ID is {} and your ECS ID is {entity:?}",
58 *entity_id
59 ));
60 1
61 }));
62
63 let whereareyou = |ctx: &Ctx| {
64 let source = ctx.source.lock();
65 let position = source.bot.position();
66 source.reply(format!(
67 "I'm at {}, {}, {}",
68 position.x, position.y, position.z
69 ));
70 1
71 };
72 commands.register(literal("whereareyou").executes(whereareyou));
73 commands.register(literal("pos").executes(whereareyou));
74
75 commands.register(literal("whoareyou").executes(|ctx: &Ctx| {
76 let source = ctx.source.lock();
77 source.reply(format!(
78 "I am {} ({}, {})",
79 source.bot.username(),
80 source.bot.uuid(),
81 source.bot.entity
82 ));
83 1
84 }));
85
86 commands.register(literal("getdirection").executes(|ctx: &Ctx| {
87 let source = ctx.source.lock();
88 let direction = source.bot.direction();
89 source.reply(format!(
90 "I'm looking at {}, {}",
91 direction.y_rot(),
92 direction.x_rot()
93 ));
94 1
95 }));
96
97 commands.register(literal("health").executes(|ctx: &Ctx| {
98 let source = ctx.source.lock();
99
100 let health = source.bot.health();
101 source.reply(format!("I have {health} health"));
102 1
103 }));
104
105 commands.register(literal("lookingat").executes(|ctx: &Ctx| {
106 let source = ctx.source.lock();
107
108 let hit_result = source.bot.hit_result();
109
110 match &hit_result {
111 HitResult::Block(r) => {
112 if r.miss {
113 source.reply("I'm not looking at anything");
114 return 0;
115 }
116 let block_pos = r.block_pos;
117 let block = source.bot.world().read().get_block_state(block_pos);
118 source.reply(format!("I'm looking at {block:?} at {block_pos:?}"));
119 }
120 HitResult::Entity(r) => {
121 let entity_kind = **source.bot.entity_component::<EntityKindComponent>(r.entity);
122 source.reply(format!(
123 "I'm looking at {entity_kind} ({:?}) at {}",
124 r.entity, r.location
125 ));
126 }
127 }
128
129 1
130 }));
131
132 commands.register(literal("getblock").then(argument("x", integer()).then(
133 argument("y", integer()).then(argument("z", integer()).executes(|ctx: &Ctx| {
134 let source = ctx.source.lock();
135 let x = get_integer(ctx, "x").unwrap();
136 let y = get_integer(ctx, "y").unwrap();
137 let z = get_integer(ctx, "z").unwrap();
138 println!("getblock xyz {x} {y} {z}");
139 let block_pos = BlockPos::new(x, y, z);
140 let block = source.bot.world().read().get_block_state(block_pos);
141 source.reply(format!("BlockKind at {block_pos} is {block:?}"));
142 1
143 })),
144 )));
145 commands.register(literal("getfluid").then(argument("x", integer()).then(
146 argument("y", integer()).then(argument("z", integer()).executes(|ctx: &Ctx| {
147 let source = ctx.source.lock();
148 let x = get_integer(ctx, "x").unwrap();
149 let y = get_integer(ctx, "y").unwrap();
150 let z = get_integer(ctx, "z").unwrap();
151 println!("getfluid xyz {x} {y} {z}");
152 let block_pos = BlockPos::new(x, y, z);
153 let block = source.bot.world().read().get_fluid_state(block_pos);
154 source.reply(format!("Fluid at {block_pos} is {block:?}"));
155 1
156 })),
157 )));
158
159 commands.register(literal("pathfinderstate").executes(|ctx: &Ctx| {
160 let source = ctx.source.lock();
161 let pathfinder = source.bot.get_component::<Pathfinder>();
162 let Some(pathfinder) = pathfinder else {
163 source.reply("I don't have the Pathfinder ocmponent");
164 return 1;
165 };
166 source.reply(format!(
167 "pathfinder.is_calculating: {}",
168 pathfinder.is_calculating
169 ));
170
171 let executing_path = source.bot.get_component::<ExecutingPath>();
172 let Some(executing_path) = executing_path else {
173 source.reply("I'm not executing a path");
174 return 1;
175 };
176 source.reply(format!(
177 "is_path_partial: {}, path.len: {}, queued_path.len: {}",
178 executing_path.is_path_partial,
179 executing_path.path.len(),
180 if let Some(queued) = &executing_path.queued_path {
181 queued.len().to_string()
182 } else {
183 "n/a".to_owned()
184 },
185 ));
186 1
187 }));
188
189 commands.register(literal("startuseitem").executes(|ctx: &Ctx| {
190 let source = ctx.source.lock();
191 source.bot.start_use_item();
192 source.reply("Ok!");
193 1
194 }));
195 commands.register(literal("maxstacksize").executes(|ctx: &Ctx| {
196 let source = ctx.source.lock();
197 let max_stack_size = source
198 .bot
199 .get_held_item()
200 .get_component::<MaxStackSize>()
201 .map_or(-1, |s| s.count);
202 source.reply(format!("{max_stack_size}"));
203 1
204 }));
205
206 commands.register(literal("dimensions").executes(|ctx: &Ctx| {
207 let source = ctx.source.lock();
208 let bot_dimensions = source.bot.dimensions();
209 source.reply(format!("{bot_dimensions:?}"));
210 1
211 }));
212
213 commands.register(literal("players").executes(|ctx: &Ctx| {
214 let source = ctx.source.lock();
215 let player_entities = source
216 .bot
217 .nearest_entities_by::<(), With<metadata::Player>>(|_: ()| true);
218 let tab_list = source.bot.tab_list();
219 for player_entity in player_entities {
220 let uuid = player_entity.uuid();
221 source.reply(format!(
222 "{} - {} ({:?})",
223 player_entity.id(),
224 tab_list.get(&uuid).map_or("?", |p| p.profile.name.as_str()),
225 uuid
226 ));
227 }
228 1
229 }));
230
231 commands.register(literal("enchants").executes(|ctx: &Ctx| {
232 let source = ctx.source.lock();
233 source.bot.with_registry_holder(|r| {
234 let enchants = &r.enchantment;
235 println!("enchants: {enchants:?}");
236 });
237 1
238 }));
239
240 commands.register(literal("attributes").executes(|ctx: &Ctx| {
241 let source = ctx.source.lock();
242 let attributes = source.bot.attributes();
243 println!("attributes: {attributes:?}");
244 1
245 }));
246
247 commands.register(literal("debugecsleak").executes(|ctx: &Ctx| {
248 let source = ctx.source.lock();
249
250 source.reply("Ok!");
251
252
253
254 source.bot.disconnect();
255
256 let ecs = source.bot.ecs.clone();
257 thread::spawn(move || {
258 thread::sleep(Duration::from_secs(1));
259 // dump the ecs
260
261 let mut ecs = ecs.write();
262
263 let report_path = env::temp_dir().join("azalea-ecs-leak-report.txt");
264 let mut report = File::create(&report_path).unwrap();
265
266 let mut query = ecs.query::<EntityRef>();
267 for entity in query.iter(& ecs) {
268 writeln!(report, "Entity: {}", entity.id()).unwrap();
269 let archetype = entity.archetype();
270 let component_count = archetype.component_count();
271
272 let component_names = archetype
273 .components()
274 .iter()
275 .map(|c| ecs.components().get_info(*c).unwrap().name().to_string())
276 .collect::<Vec<_>>();
277 writeln!(
278 report,
279 "- {component_count} components: {}",
280 component_names.join(", ")
281 )
282 .unwrap();
283 }
284
285 writeln!(report).unwrap();
286
287
288 for (info, _) in ecs.iter_resources() {
289 let name = info.name().to_string();
290 writeln!(report, "Resource: {name}").unwrap();
291 // writeln!(report, "- Size: {} bytes",
292 // info.layout().size()).unwrap();
293
294 match name.as_ref() {
295 "azalea_world::container::InstanceContainer" => {
296 let instance_container = ecs.resource::<InstanceContainer>();
297
298 for (instance_name, instance) in &instance_container.instances {
299 writeln!(report, "- Name: {instance_name}").unwrap();
300 writeln!(report, "- Reference count: {}", instance.strong_count())
301 .unwrap();
302 if let Some(instance) = instance.upgrade() {
303 let instance = instance.read();
304 let strong_chunks = instance
305 .chunks
306 .map
307 .iter()
308 .filter(|(_, v)| v.strong_count() > 0)
309 .count();
310 writeln!(
311 report,
312 "- Chunks: {} strongly referenced, {} in map",
313 strong_chunks,
314 instance.chunks.map.len()
315 )
316 .unwrap();
317 writeln!(
318 report,
319 "- Entities: {}",
320 instance.entities_by_chunk.len()
321 )
322 .unwrap();
323 }
324 }
325 }
326 "bevy_ecs::message::Messages<azalea_client::packet::game::ReceivePacketEvent>" => {
327 let events = ecs.resource::<Messages<game::ReceiveGamePacketEvent>>();
328 writeln!(report, "- Event count: {}", events.len()).unwrap();
329 }
330 "bevy_ecs::message::Messages<azalea_client::chunks::ReceiveChunkEvent>" => {
331 let events = ecs.resource::<Messages<ReceiveChunkEvent>>();
332 writeln!(report, "- Event count: {}", events.len()).unwrap();
333 }
334
335 _ => {}
336 }
337 }
338
339 println!("\x1b[1mWrote report to {}\x1b[m", report_path.display());
340 });
341
342 1
343 }));
344
345 commands.register(literal("exit").executes(|ctx: &Ctx| {
346 let source = ctx.source.lock();
347 source.reply("bye!");
348
349 source.bot.disconnect();
350
351 let source = ctx.source.clone();
352 thread::spawn(move || {
353 thread::sleep(Duration::from_secs(1));
354
355 source
356 .lock()
357 .bot
358 .ecs
359 .write()
360 .write_message(AppExit::Success);
361 });
362
363 1
364 }));
365}Trait Implementations§
Source§impl Clone for OminousItemSpawnerItem
impl Clone for OminousItemSpawnerItem
Source§fn clone(&self) -> OminousItemSpawnerItem
fn clone(&self) -> OminousItemSpawnerItem
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Component for OminousItemSpawnerItem
impl Component for OminousItemSpawnerItem
Source§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
Source§type Mutability = Mutable
type Mutability = Mutable
Component<Mutability = Mutable>],
while immutable components will instead have [Component<Mutability = Immutable>]. Read moreSource§fn register_required_components(
_requiree: ComponentId,
required_components: &mut RequiredComponentsRegistrator<'_, '_>,
)
fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )
Source§fn clone_behavior() -> ComponentCloneBehavior
fn clone_behavior() -> ComponentCloneBehavior
§fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
on_add [ComponentHook] for this [Component] if one is defined.§fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
on_insert [ComponentHook] for this [Component] if one is defined.§fn on_replace() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_replace() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
on_replace [ComponentHook] for this [Component] if one is defined.§fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
on_remove [ComponentHook] for this [Component] if one is defined.§fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
on_despawn [ComponentHook] for this [Component] if one is defined.§fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
EntityMapper]. This is used to remap entities in contexts like scenes and entity cloning.
When deriving [Component], this is populated by annotating fields containing entities with #[entities] Read moreSource§impl Deref for OminousItemSpawnerItem
impl Deref for OminousItemSpawnerItem
Source§impl DerefMut for OminousItemSpawnerItem
impl DerefMut for OminousItemSpawnerItem
Source§impl PartialEq for OminousItemSpawnerItem
impl PartialEq for OminousItemSpawnerItem
impl StructuralPartialEq for OminousItemSpawnerItem
Auto Trait Implementations§
impl Freeze for OminousItemSpawnerItem
impl RefUnwindSafe for OminousItemSpawnerItem
impl Send for OminousItemSpawnerItem
impl Sync for OminousItemSpawnerItem
impl Unpin for OminousItemSpawnerItem
impl UnwindSafe for OminousItemSpawnerItem
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<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut ComponentsRegistrator<'_>, ids: &mut impl FnMut(ComponentId), )
§fn get_component_ids(
components: &Components,
ids: &mut impl FnMut(Option<ComponentId>),
)
fn get_component_ids( components: &Components, ids: &mut impl FnMut(Option<ComponentId>), )
Bundle]’s component ids. This will be None if the component has not been registered.§impl<C> BundleFromComponents for Cwhere
C: Component,
impl<C> BundleFromComponents for Cwhere
C: Component,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.