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}