valence_protocol/packets/play/
entity_equipment_update_s2c.rs
1use std::io::Write;
2
3use crate::{Decode, Encode, ItemStack, Packet, VarInt};
4
5#[derive(Clone, PartialEq, Debug, Packet)]
6pub struct EntityEquipmentUpdateS2c {
7 pub entity_id: VarInt,
8 pub equipment: Vec<EquipmentEntry>,
9}
10
11#[derive(Clone, PartialEq, Debug, Encode, Decode)]
12pub struct EquipmentEntry {
13 pub slot: i8,
14 pub item: ItemStack,
15}
16
17impl Encode for EntityEquipmentUpdateS2c {
18 fn encode(&self, mut w: impl Write) -> anyhow::Result<()> {
19 self.entity_id.encode(&mut w)?;
20
21 for i in 0..self.equipment.len() {
22 let slot = self.equipment[i].slot;
23 if i != self.equipment.len() - 1 {
24 (slot | -128).encode(&mut w)?;
25 } else {
26 slot.encode(&mut w)?;
27 }
28 self.equipment[i].item.encode(&mut w)?;
29 }
30
31 Ok(())
32 }
33}
34
35impl<'a> Decode<'a> for EntityEquipmentUpdateS2c {
36 fn decode(r: &mut &'a [u8]) -> anyhow::Result<Self> {
37 let entity_id = VarInt::decode(r)?;
38
39 let mut equipment = vec![];
40
41 loop {
42 let slot = i8::decode(r)?;
43 let item = ItemStack::decode(r)?;
44 equipment.push(EquipmentEntry {
45 slot: slot & 127,
46 item,
47 });
48 if slot & -128 == 0 {
49 break;
50 }
51 }
52
53 Ok(Self {
54 entity_id,
55 equipment,
56 })
57 }
58}