g_rust/extension/parsers/
stuffdata.rs1use std::collections::HashMap;
2use crate::extension::parsers::stuffdata::StuffData::{CrackableStuffData, EmptyStuffData, HighScoreStuffData, IntArrayStuffData, LegacyStuffData, MapStuffData, StringArrayStuffData, VoteResultStuffData};
3use crate::protocol::hpacket::HPacket;
4use crate::protocol::vars::packetvariable::PacketVariable;
5
6#[derive(Clone, Debug, PartialEq)]
7pub enum StuffData {
8 LegacyStuffData {
9 legacy_string: String,
10 unique_serial_data: Option<UniqueSerialData>
11 },
12 MapStuffData {
13 map: HashMap<String, String>,
14 unique_serial_data: Option<UniqueSerialData>
15 },
16 StringArrayStuffData {
17 values: Vec<String>,
18 unique_serial_data: Option<UniqueSerialData>
19 },
20 VoteResultStuffData {
21 legacy_string: String,
22 result: i32,
23 unique_serial_data: Option<UniqueSerialData>
24 },
25 EmptyStuffData {
26 unique_serial_data: Option<UniqueSerialData>
27 },
28 IntArrayStuffData {
29 values: Vec<i32>,
30 unique_serial_data: Option<UniqueSerialData>
31 },
32 HighScoreStuffData {
33 legacy_string: String,
34 score_type: i32,
35 clear_type: i32,
36 entries: Vec<HighScoreData>
37 },
38 CrackableStuffData {
39 legacy_string: String,
40 hits: i32,
41 target: i32,
42 unique_serial_data: Option<UniqueSerialData>
43 }
44}
45
46impl StuffData {
47 pub fn get_unique_serial_data(&self) -> Option<UniqueSerialData> {
48 match self {
49 LegacyStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
50 MapStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
51 StringArrayStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
52 VoteResultStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
53 EmptyStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
54 IntArrayStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
55 HighScoreStuffData { .. } => None,
56 CrackableStuffData { unique_serial_data, .. } => unique_serial_data.clone()
57 }
58 }
59}
60
61impl Default for StuffData {
62 fn default() -> Self {
63 EmptyStuffData {
64 unique_serial_data: None
65 }
66 }
67}
68
69impl PacketVariable for StuffData {
70 fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
71 let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
72
73 let cat: i32 = packet.read();
74
75 (match cat & 255 {
76 0 => LegacyStuffData {
77 legacy_string: packet.read(),
78 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
79 },
80 1 => MapStuffData {
81 map: packet.read(),
82 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
83 },
84 2 => StringArrayStuffData {
85 values: packet.read(),
86 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
87 },
88 3 => VoteResultStuffData {
89 legacy_string: packet.read(),
90 result: packet.read(),
91 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
92 },
93 4 => EmptyStuffData {
94 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
95 },
96 5 => IntArrayStuffData {
97 values: packet.read(),
98 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
99 },
100 6 => HighScoreStuffData {
101 legacy_string: packet.read(),
102 score_type: packet.read(),
103 clear_type: packet.read(),
104 entries: packet.read()
105 },
106 7 => CrackableStuffData {
107 legacy_string: packet.read(),
108 hits: packet.read(),
109 target: packet.read(),
110 unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
111 },
112 _ => panic!("Unknown stuff data type")
113 }, packet.read_index - 6)
114 }
115
116 fn to_packet(&self) -> Vec<u8> {
117 match self {
118 LegacyStuffData {
119 legacy_string, unique_serial_data
120 } => (
121 0i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
122 legacy_string.clone(), unique_serial_data.clone()
123 ).to_packet(),
124 MapStuffData {
125 map, unique_serial_data
126 } => (
127 1i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
128 map.clone(), unique_serial_data.clone()
129 ).to_packet(),
130 StringArrayStuffData {
131 values, unique_serial_data
132 } => (
133 2i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
134 values.clone(), unique_serial_data.clone()
135 ).to_packet(),
136 VoteResultStuffData {
137 legacy_string, result, unique_serial_data
138 } => (
139 3i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
140 legacy_string.clone(), *result, unique_serial_data.clone()
141 ).to_packet(),
142 EmptyStuffData {
143 unique_serial_data
144 } => (
145 4i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
146 unique_serial_data.clone()
147 ).to_packet(),
148 IntArrayStuffData {
149 values, unique_serial_data
150 } => (
151 5i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
152 values.clone(), unique_serial_data.clone()
153 ).to_packet(),
154 HighScoreStuffData {
155 legacy_string, score_type, clear_type, entries
156 } => (
157 6i32,
158 legacy_string.clone(), *score_type, *clear_type, entries.clone()
159 ).to_packet(),
160 CrackableStuffData {
161 legacy_string, hits, target, unique_serial_data
162 } => (
163 7i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
164 legacy_string.clone(), *hits, *target, unique_serial_data.clone()
165 ).to_packet()
166 }
167 }
168}
169
170#[derive(Clone, Debug, Default, PacketVariable, PartialEq)]
171pub struct UniqueSerialData {
172 pub number: i32,
173 pub size: i32
174}
175
176#[derive(Clone, Debug, Default, PacketVariable, PartialEq)]
177pub struct HighScoreData {
178 pub score: i32,
179 pub users: Vec<String>
180}
181
182