1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-04 02:24:12 +02:00

add serde support for packets

This commit is contained in:
Robin Appelman 2021-07-25 15:09:36 +02:00
commit 03f8b8a424
27 changed files with 556 additions and 490 deletions

View file

@ -1,10 +1,11 @@
use bitbuffer::{BitRead, BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
use serde::{Deserialize, Serialize};
use crate::demo::sendprop::{read_bit_coord, write_bit_coord};
use crate::demo::vector::Vector;
use crate::{ReadResult, Stream};
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BSPDecalMessage {
pub position: Vector,
pub texture_index: u16,

View file

@ -1,10 +1,11 @@
use bitbuffer::{BitRead, BitReadSized, BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
use serde::{Deserialize, Serialize};
use crate::demo::message::stringtable::log_base2;
use crate::{ReadResult, Stream};
use std::cmp::min;
#[derive(BitReadSized, BitWriteSized, Debug, PartialEq)]
#[derive(BitReadSized, BitWriteSized, Debug, PartialEq, Serialize, Deserialize)]
pub struct ClassInfoEntry {
#[size = "input_size"]
class_id: u16,
@ -12,7 +13,7 @@ pub struct ClassInfoEntry {
table_name: String,
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct ClassInfoMessage {
count: u16,
create: bool,

View file

@ -1,5 +1,6 @@
use bitbuffer::{BitRead, BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
use parse_display::Display;
use serde::{Deserialize, Serialize};
use crate::demo::gameevent_gen::GameEventType;
use crate::demo::gamevent::{
@ -8,7 +9,7 @@ use crate::demo::gamevent::{
use crate::demo::parser::{Encode, ParseBitSkip};
use crate::{GameEventError, Parse, ParseError, ParserState, ReadResult, Result, Stream};
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct GameEventMessage {
pub event_type_id: GameEventTypeId,
pub event: GameEvent,
@ -114,7 +115,21 @@ impl ParseBitSkip<'_> for GameEventMessage {
}
}
#[derive(BitRead, BitWrite, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Display)]
#[derive(
BitRead,
BitWrite,
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Display,
Serialize,
Deserialize,
)]
pub struct GameEventTypeId(#[size = 9] u16);
impl From<GameEventTypeId> for usize {
@ -129,7 +144,7 @@ impl From<GameEventTypeId> for u16 {
}
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct GameEventListMessage {
pub event_list: Vec<GameEventDefinition>,
}

View file

@ -1,38 +1,39 @@
use crate::Stream;
/// Messages that consists only of primitives and string and can be derived
use bitbuffer::{BitRead, BitWrite, LittleEndian};
use serde::{Deserialize, Serialize};
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct FileMessage {
pub transfer_id: u32,
pub file_name: String,
pub requested: bool,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct NetTickMessage {
pub tick: u32,
pub frame_time: u16,
pub std_dev: u16,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct StringCmdMessage {
pub command: String,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct SignOnStateMessage {
pub state: u8,
pub count: u32,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct PrintMessage {
pub value: String,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct ServerInfoMessage {
pub version: u16,
pub server_count: u32,
@ -53,18 +54,18 @@ pub struct ServerInfoMessage {
pub replay: bool,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct SetPauseMessage {
pub pause: bool,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct SetViewMessage {
#[size = 11]
pub index: u16,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct FixAngleMessage {
pub relative: bool,
pub x: u16,
@ -72,8 +73,9 @@ pub struct FixAngleMessage {
pub z: u16,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
#[endianness = "LittleEndian"]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct EntityMessage<'a> {
#[size = 11]
pub index: u16,
@ -85,14 +87,15 @@ pub struct EntityMessage<'a> {
pub data: Stream<'a>,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct PreFetchMessage {
#[size = 14]
pub index: u16,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
#[endianness = "LittleEndian"]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct MenuMessage<'a> {
pub kind: u16,
pub length: u16,
@ -100,14 +103,15 @@ pub struct MenuMessage<'a> {
pub index: Stream<'a>,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
pub struct GetCvarValueMessage {
pub cookie: u32,
pub value: String,
}
#[derive(BitRead, BitWrite, Debug, PartialEq)]
#[derive(BitRead, BitWrite, Debug, PartialEq, Serialize, Deserialize)]
#[endianness = "LittleEndian"]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct CmdKeyValuesMessage<'a> {
pub length: u32,
#[size = "length.saturating_mul(8)"]

View file

@ -12,6 +12,7 @@ use crate::demo::message::voice::*;
use crate::demo::parser::{Encode, ParseBitSkip};
use crate::{Parse, ParserState, Result, Stream};
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
pub mod bspdecal;
@ -61,7 +62,8 @@ pub enum MessageType {
CmdKeyValues = 32,
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub enum Message<'a> {
Empty,
File(FileMessage),

View file

@ -49,7 +49,7 @@ pub enum PVS {
Delete = 3,
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PacketEntity {
pub server_class: ClassId,
pub entity_index: EntityId,
@ -174,7 +174,7 @@ fn test_bit_var_roundtrip() {
bit_var_normal(123456789);
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct PacketEntitiesMessage {
pub entities: Vec<PacketEntity>,
pub removed_entities: Vec<EntityId>,

View file

@ -1,8 +1,9 @@
use bitbuffer::{BitRead, BitReadStream, BitWrite, BitWriteStream, Endianness};
use serde::{Deserialize, Serialize};
use crate::ReadResult;
#[derive(Debug, BitWrite, PartialEq)]
#[derive(Debug, BitWrite, PartialEq, Serialize, Deserialize)]
pub struct ConVar {
key: String,
value: String,
@ -20,7 +21,7 @@ impl<E: Endianness> BitRead<'_, E> for ConVar {
}
}
#[derive(Debug, BitRead, PartialEq)]
#[derive(Debug, BitRead, PartialEq, Serialize, Deserialize)]
pub struct SetConVarMessage {
length: u8,
#[size = "length"]

View file

@ -2,6 +2,7 @@ use bitbuffer::{
BitReadBuffer, BitReadStream, BitWrite, BitWriteSized, BitWriteStream, LittleEndian,
};
use num_traits::{PrimInt, Unsigned};
use serde::{Deserialize, Serialize};
use snap::raw::{decompress_len, Decoder};
use crate::demo::lzss::decompress;
@ -13,12 +14,13 @@ use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
use std::borrow::Cow;
use std::cmp::min;
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct CreateStringTableMessage<'a> {
pub table: StringTable<'a>,
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StringTableMeta {
pub max_entries: u16,
pub fixed_userdata_size: Option<FixedUserDataSize>,
@ -233,7 +235,8 @@ fn test_create_string_table_roundtrip() {
);
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct UpdateStringTableMessage<'a> {
pub entries: Vec<(u16, StringTableEntry<'a>)>,
pub table_id: u8,

View file

@ -7,13 +7,14 @@ use crate::demo::sendprop::SendProp;
use crate::Result;
use crate::{Parse, ParseError, ParserState, Stream};
use bitbuffer::{BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct TempEntitiesMessage {
pub events: Vec<EventInfo>,
}
#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EventInfo {
pub class_id: ClassId,
pub fire_delay: f32,

View file

@ -5,7 +5,7 @@ use crate::demo::handle_utf8_error;
use crate::{ReadResult, Stream};
#[derive(BitRead, BitWrite, Clone, Copy, Debug, PartialEq, Eq)]
#[derive(BitRead, BitWrite, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
#[discriminant_bits = 8]
pub enum UserMessageType {
@ -70,7 +70,8 @@ pub enum UserMessageType {
Unknown = 255,
}
#[derive(Debug, PartialEq)]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub enum UserMessage<'a> {
SayText2(Box<SayText2Message>),
Text(Box<TextMessage>),
@ -204,7 +205,7 @@ impl BitWrite<LittleEndian> for ChatMessageKind {
}
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SayText2Message {
pub client: u8,
pub raw: u8,
@ -312,7 +313,7 @@ fn test_say_text2_roundtrip() {
});
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[discriminant_bits = 8]
pub enum HudTextLocation {
PrintNotify = 1,
@ -321,31 +322,31 @@ pub enum HudTextLocation {
PrintCenter,
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TextMessage {
pub location: HudTextLocation,
pub text: String,
pub substitute: [String; 4],
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResetHudMessage {
pub data: u8,
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TrainMessage {
pub data: u8,
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceSubtitleMessage {
client: u8,
menu: u8,
item: u8,
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ShakeMessage {
command: u8,
amplitude: f32,
@ -353,7 +354,8 @@ pub struct ShakeMessage {
duration: f32,
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct UnknownUserMessage<'a> {
data: Stream<'a>,
}

View file

@ -1,8 +1,9 @@
use bitbuffer::{BitRead, BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
use serde::{Deserialize, Serialize};
use crate::{ReadResult, Stream};
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceInitMessage {
codec: String,
quality: u8,
@ -57,8 +58,9 @@ fn test_voice_init_roundtrip() {
});
}
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq)]
#[derive(BitRead, BitWrite, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[endianness = "LittleEndian"]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct VoiceDataMessage<'a> {
client: u8,
proximity: u8,
@ -67,7 +69,8 @@ pub struct VoiceDataMessage<'a> {
data: Stream<'a>,
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(bound(deserialize = "'a: 'static"))]
pub struct ParseSoundsMessage<'a> {
pub reliable: bool,
pub num: u8,