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}