basin2_lib/
mcproto.rs

1use crate::nbt::Nbt;
2use crate::result::*;
3use bytes::buf::Buf;
4use bytes::buf::BufMut;
5use bytes::BytesMut;
6use enum_primitive::FromPrimitive;
7use uuid::Uuid;
8
9pub fn get_var_int_len(value: i32) -> usize {
10    let mut value = value as u32;
11    let mut i = 1;
12    while (value & !0b1111111) != 0 {
13        i += 1;
14        value >>= 7;
15        if i > 5 {
16            break;
17        }
18    }
19    return i;
20}
21
22pub fn invalid_data<T>() -> Result<T> {
23    return Err(Box::new(IoError::from(ErrorKind::InvalidData)));
24}
25
26pub trait McProtoBase {
27
28    fn get_mc_var_int(&mut self) -> Result<i32>;
29    fn get_mc_var_long(&mut self) -> Result<i64>;
30    fn get_mc_string(&mut self, bound: i32) -> Result<String>;
31    fn get_mc_u8(&mut self) -> Result<u8>;
32    fn get_mc_i8(&mut self) -> Result<i8>;
33    fn get_mc_bool(&mut self) -> Result<bool>;
34    fn get_mc_i16(&mut self) -> Result<i16>;
35    fn get_mc_i64(&mut self) -> Result<i64>;
36    fn get_mc_f64(&mut self) -> Result<f64>;
37    fn get_mc_f32(&mut self) -> Result<f32>;
38    fn get_mc_uuid(&mut self) -> Result<Uuid>;
39    fn get_mc_i32(&mut self) -> Result<i32>;
40    fn get_mc_nbt(&mut self) -> Result<Nbt>;
41    fn get_mc_u16(&mut self) -> Result<u16>;
42    fn get_mc_byte_array(&mut self) -> Result<Vec<u8>>;
43    fn get_mc_byte_array_bounded(&mut self, bound: i32) -> Result<Vec<u8>>;
44    fn get_mc_enum<T: FromPrimitive>(&mut self) -> Result<T>;
45    fn get_mc_enum_i32<T: FromPrimitive>(&mut self) -> Result<T>;
46    fn get_mc_enum_u8<T: FromPrimitive>(&mut self) -> Result<T>;
47    fn set_mc_var_int(&mut self, value: i32);
48    fn set_mc_var_long(&mut self, value: i64);
49    fn set_mc_string(&mut self, value: String);
50    fn set_mc_u8(&mut self, value: u8);
51    fn set_mc_i8(&mut self, value: i8);
52    fn set_mc_bool(&mut self, value: bool);
53    fn set_mc_i16(&mut self, value: i16);
54    fn set_mc_i64(&mut self, value: i64);
55    fn set_mc_f64(&mut self, value: f64);
56    fn set_mc_f32(&mut self, value: f32);
57    fn set_mc_uuid(&mut self, value: Uuid);
58    fn set_mc_i32(&mut self, value: i32);
59    fn set_mc_nbt(&mut self, value: Nbt);
60    fn set_mc_u16(&mut self, value: u16);
61    fn set_mc_byte_array(&mut self, value: Vec<u8>);
62
63    fn clone_bounded(&mut self, bound: i32) -> Result<Self>
64    where
65        Self: Sized;
66
67    fn read_primitive_slice<T: Sized + Clone>(&mut self, length: usize) -> Result<Vec<T>>;
68    fn write_primitive_slice<T: Sized>(&mut self, data: &[T]);
69    fn display(&self) -> String;
70}
71
72impl McProtoBase for BytesMut {
73    fn get_mc_var_int(&mut self) -> Result<i32> {
74        let mut i = 0;
75        let mut current_byte: u8 = 0xff;
76        let mut output: i32 = 0;
77        while (current_byte & 128) == 128 {
78            current_byte = self.get_mc_u8()?;
79            output |= ((current_byte as u32 & 127) << (i * 7)) as i32;
80            i += 1;
81            if i > 5 {
82                break;
83            }
84        }
85        Ok(output)
86    }
87
88    fn get_mc_var_long(&mut self) -> Result<i64> {
89        let mut i = 0;
90        let mut current_byte: u8 = 0xff;
91        let mut output: i64 = 0;
92        while (current_byte & 128) == 128 {
93            current_byte = self.get_mc_u8()?;
94            output |= ((current_byte as u64 & 127) << (i * 7)) as i64;
95            i += 1;
96            if i > 10 {
97                break;
98            }
99        }
100        Ok(output)
101    }
102
103    fn get_mc_string(&mut self, bound: i32) -> Result<String> {
104        let length = self.get_mc_var_int()?;
105        if length > bound * 4 || length < 0 || length as usize > self.len() {
106            invalid_data()
107        } else {
108            let string_value = String::from_utf8(self.split_to(length as usize).to_vec())?;
109            if string_value.len() > bound as usize {
110                invalid_data()
111            } else {
112                Ok(string_value)
113            }
114        }
115    }
116
117    fn get_mc_u8(&mut self) -> Result<u8> {
118        if self.len() < 1 {
119            invalid_data()
120        } else {
121            Ok(self.get_u8())
122        }
123    }
124
125    fn get_mc_i8(&mut self) -> Result<i8> {
126        if self.len() < 1 {
127            invalid_data()
128        } else {
129            Ok(self.get_i8())
130        }
131    }
132
133    fn get_mc_bool(&mut self) -> Result<bool> {
134        if self.len() < 1 {
135            invalid_data()
136        } else {
137            Ok(self.get_u8() != 0)
138        }
139    }
140
141    fn get_mc_i16(&mut self) -> Result<i16> {
142        if self.len() < 2 {
143            invalid_data()
144        } else {
145            Ok(self.get_i16())
146        }
147    }
148
149    fn get_mc_i64(&mut self) -> Result<i64> {
150        if self.len() < 8 {
151            invalid_data()
152        } else {
153            Ok(self.get_i64())
154        }
155    }
156
157    fn get_mc_f64(&mut self) -> Result<f64> {
158        if self.len() < 8 {
159            invalid_data()
160        } else {
161            Ok(self.get_f64())
162        }
163    }
164
165    fn get_mc_f32(&mut self) -> Result<f32> {
166        if self.len() < 4 {
167            invalid_data()
168        } else {
169            Ok(self.get_f32())
170        }
171    }
172
173    fn get_mc_uuid(&mut self) -> Result<Uuid> {
174        if self.len() < 16 {
175            invalid_data()
176        } else {
177            Ok(Uuid::from_bytes(&self.split_to(16).to_vec())?)
178        }
179    }
180
181    fn get_mc_i32(&mut self) -> Result<i32> {
182        if self.len() < 4 {
183            invalid_data()
184        } else {
185            Ok(self.get_i32())
186        }
187    }
188
189    fn get_mc_nbt(&mut self) -> Result<Nbt> {
190        Ok(Nbt::parse(self)?)
191    }
192
193    fn get_mc_u16(&mut self) -> Result<u16> {
194        if self.len() < 2 {
195            invalid_data()
196        } else {
197            Ok(self.get_u16())
198        }
199    }
200
201    fn get_mc_byte_array(&mut self) -> Result<Vec<u8>> {
202        Ok(self.to_vec())
203    }
204
205    fn get_mc_byte_array_bounded(&mut self, bound: i32) -> Result<Vec<u8>> {
206        let length = self.get_mc_var_int()?;
207        if length > bound || length < 0 || length as usize > self.len() {
208            return invalid_data();
209        }
210        Ok(self.split_to(length as usize).to_vec())
211    }
212
213    fn get_mc_enum<T: FromPrimitive>(&mut self) -> Result<T> {
214        let action = T::from_i32(self.get_mc_var_int()?);
215        let action = match action {
216            Some(action) => action,
217            None => {
218                return invalid_data();
219            }
220        };
221        return Ok(action);
222    }
223
224    fn get_mc_enum_i32<T: FromPrimitive>(&mut self) -> Result<T> {
225        let action = T::from_i32(self.get_mc_i32()?);
226        let action = match action {
227            Some(action) => action,
228            None => {
229                return invalid_data();
230            }
231        };
232        return Ok(action);
233    }
234
235    fn get_mc_enum_u8<T: FromPrimitive>(&mut self) -> Result<T> {
236        let action = T::from_u8(self.get_mc_u8()?);
237        let action = match action {
238            Some(action) => action,
239            None => {
240                return invalid_data();
241            }
242        };
243        return Ok(action);
244    }
245
246    fn set_mc_var_int(&mut self, value: i32) {
247        let mut value = value as u32;
248        self.reserve(6);
249        while (value & !0b1111111) != 0 {
250            self.put_u8((value as u8 & 127) | 128);
251            value >>= 7;
252        }
253        self.put_u8(value as u8);
254    }
255
256    fn set_mc_var_long(&mut self, value: i64) {
257        let mut value = value as u64;
258        self.reserve(12);
259        while (value & !0b1111111) != 0 {
260            self.put_u8((value as u8 & 127) | 128);
261            value >>= 7;
262        }
263        self.put_u8(value as u8);
264    }
265
266    fn set_mc_string(&mut self, value: String) {
267        let bytes = value.as_bytes();
268        self.set_mc_var_int(bytes.len() as i32);
269        self.extend(bytes);
270    }
271
272    fn set_mc_u8(&mut self, value: u8) {
273        self.reserve(1);
274        self.put_u8(value);
275    }
276
277    fn set_mc_i8(&mut self, value: i8) {
278        self.reserve(1);
279        self.put_i8(value);
280    }
281
282    fn set_mc_bool(&mut self, value: bool) {
283        self.reserve(1);
284        self.put_u8(if value { 1 } else { 0 });
285    }
286
287    fn set_mc_i16(&mut self, value: i16) {
288        self.reserve(2);
289        self.put_i16(value);
290    }
291
292    fn set_mc_i64(&mut self, value: i64) {
293        self.reserve(8);
294        self.put_i64(value);
295    }
296
297    fn set_mc_f64(&mut self, value: f64) {
298        self.reserve(8);
299        self.put_f64(value);
300    }
301
302    fn set_mc_f32(&mut self, value: f32) {
303        self.reserve(4);
304        self.put_f32(value);
305    }
306
307    fn set_mc_uuid(&mut self, value: Uuid) {
308        self.reserve(16);
309        self.extend_from_slice(value.as_bytes());
310    }
311
312    fn set_mc_i32(&mut self, value: i32) {
313        self.reserve(4);
314        self.put_i32(value);
315    }
316
317    fn set_mc_nbt(&mut self, value: Nbt) {
318        value.serialize(self);
319    }
320
321    fn set_mc_u16(&mut self, value: u16) {
322        self.reserve(2);
323        self.put_u16(value);
324    }
325
326    fn set_mc_byte_array(&mut self, value: Vec<u8>) {
327        self.set_mc_var_int(value.len() as i32);
328        self.extend(value);
329    }
330
331    fn clone_bounded(&mut self, bound: i32) -> Result<BytesMut> {
332        if self.len() > bound as usize {
333            return invalid_data();
334        }
335        let returned = self.clone();
336        let advanced = self.len();
337        self.advance(advanced);
338        Ok(returned)
339    }
340
341    fn read_primitive_slice<T: Sized + Clone>(&mut self, length: usize) -> Result<Vec<T>> {
342        let raw_length = length * std::mem::size_of::<T>();
343        if self.len() < raw_length {
344            return invalid_data();
345        }
346        let raw = &self.split_to(raw_length)[..];
347        Ok(unsafe { std::slice::from_raw_parts(raw.as_ptr() as *const T, length) }.to_vec())
348    }
349
350    fn write_primitive_slice<T: Sized>(&mut self, data: &[T]) {
351        let raw = unsafe {
352            std::slice::from_raw_parts(
353                data.as_ptr() as *const u8,
354                data.len() * std::mem::size_of::<T>(),
355            )
356        };
357        self.extend_from_slice(raw);
358    }
359
360    fn display(&self) -> String {
361        return format!("{:x?}", &self.to_vec()[..]);
362    }
363}