Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
8719413eaa |
26
Cargo.lock
generated
26
Cargo.lock
generated
@ -34,21 +34,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.9.0"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.22.0"
|
||||
version = "1.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
|
||||
checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.15.0"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
|
||||
|
||||
[[package]]
|
||||
name = "owo-colors"
|
||||
@ -58,25 +58,25 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.94"
|
||||
version = "1.0.92"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
|
||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.40"
|
||||
version = "1.0.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
|
||||
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strafesnet_roblox_bot_file"
|
||||
version = "0.3.0"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"binrw",
|
||||
"bitflags",
|
||||
@ -95,6 +95,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.18"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "strafesnet_roblox_bot_file"
|
||||
version = "0.3.0"
|
||||
version = "0.2.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
|
@ -39,5 +39,3 @@ fn _2()->Result<(),Error>{
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// TODO: file serialization test
|
||||
|
76
src/v0.rs
76
src/v0.rs
@ -171,34 +171,23 @@ pub struct WorldEventReset{
|
||||
#[binrw]
|
||||
#[brw(little)]
|
||||
pub struct WorldEventButton{
|
||||
#[br(pad_after=8)]
|
||||
pub button_id:u32,
|
||||
// This field does not exist in the final struct and
|
||||
// exists purely to de/serialize the magic number.
|
||||
#[br(temp)]
|
||||
#[bw(ignore)]
|
||||
#[brw(magic=b"quatdata")]
|
||||
_magic:(),
|
||||
}
|
||||
#[binrw]
|
||||
#[brw(little)]
|
||||
pub struct WorldEventSetTime{
|
||||
#[br(map=read_trey_double)]
|
||||
#[br(pad_after=4)]
|
||||
pub time:f64,
|
||||
#[br(temp)]
|
||||
#[bw(ignore)]
|
||||
#[brw(magic=b"data")]
|
||||
_magic:(),
|
||||
}
|
||||
#[binrw]
|
||||
#[brw(little)]
|
||||
pub struct WorldEventSetPaused{
|
||||
#[br(map=|paused:u32|paused!=0)]
|
||||
#[bw(map=|&paused:&bool|paused as u32)]
|
||||
#[bw(map=|paused:&bool|*paused as u32)]
|
||||
#[br(pad_after=8)]
|
||||
pub paused:bool,
|
||||
#[br(temp)]
|
||||
#[bw(ignore)]
|
||||
#[brw(magic=b"quatdata")]
|
||||
_magic:(),
|
||||
}
|
||||
#[binrw]
|
||||
#[brw(little)]
|
||||
@ -290,7 +279,8 @@ pub enum FlagReason{
|
||||
Teleport,
|
||||
#[brw(magic=9u32)]
|
||||
Practice,
|
||||
#[brw(magic=b"data")]
|
||||
// b"data"
|
||||
#[brw(magic=1635017060u32)]
|
||||
None,
|
||||
}
|
||||
#[binrw]
|
||||
@ -400,8 +390,12 @@ struct EventChunkHeader{
|
||||
num_events:u32,
|
||||
}
|
||||
|
||||
// binread args tech has been further refined
|
||||
fn read_data_into_events<'a,R:BinReaderExt,T:binrw::BinRead<Args<'a>=()>>(data:&mut R,events:&mut Vec<T>,num_events:usize)->binrw::BinResult<()>{
|
||||
// first time I've managed to write BinRead generics without this stupid T::Args<'a>:Required thing blocking me
|
||||
fn read_data_into_events<'a,R:BinReaderExt,T>(data:&mut R,events:&mut Vec<T>,num_events:usize)->binrw::BinResult<()>
|
||||
where
|
||||
T:binrw::BinRead,
|
||||
T::Args<'a>:binrw::__private::Required,
|
||||
{
|
||||
// there is only supposed to be at most one of each type of event chunk per block, so no need to amortize.
|
||||
events.reserve_exact(num_events);
|
||||
for _ in 0..num_events{
|
||||
@ -409,7 +403,11 @@ fn read_data_into_events<'a,R:BinReaderExt,T:binrw::BinRead<Args<'a>=()>>(data:&
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn read_data_into_events_amortized<'a,R:BinReaderExt,T:binrw::BinRead<Args<'a>=()>>(data:&mut R,events:&mut Vec<T>,num_events:usize)->binrw::BinResult<()>{
|
||||
fn read_data_into_events_amortized<'a,R:BinReaderExt,T>(data:&mut R,events:&mut Vec<T>,num_events:usize)->binrw::BinResult<()>
|
||||
where
|
||||
T:binrw::BinRead,
|
||||
T::Args<'a>:binrw::__private::Required,
|
||||
{
|
||||
// this is used when reading multiple blocks into a single object, so amortize the allocation cost.
|
||||
events.reserve(num_events);
|
||||
for _ in 0..num_events{
|
||||
@ -421,37 +419,37 @@ fn read_data_into_events_amortized<'a,R:BinReaderExt,T:binrw::BinRead<Args<'a>=(
|
||||
impl Block{
|
||||
fn read<R:BinReaderExt>(data:R)->binrw::BinResult<Block>{
|
||||
let mut block=Block::default();
|
||||
Block::read_into(data,&mut block)?;
|
||||
block.read_into(data)?;
|
||||
Ok(block)
|
||||
}
|
||||
fn read_into<R:BinReaderExt>(mut data:R,block:&mut Block)->binrw::BinResult<()>{
|
||||
fn read_into<R:BinReaderExt>(&mut self,mut data:R)->binrw::BinResult<()>{
|
||||
// well... this looks error prone
|
||||
while let Ok(event_chunk_header)=data.read_le::<EventChunkHeader>(){
|
||||
match event_chunk_header.event_type{
|
||||
EventType::Input=>read_data_into_events(&mut data,&mut block.input_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Output=>read_data_into_events(&mut data,&mut block.output_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Sound=>read_data_into_events(&mut data,&mut block.sound_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::World=>read_data_into_events(&mut data,&mut block.world_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Gravity=>read_data_into_events(&mut data,&mut block.gravity_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Run=>read_data_into_events(&mut data,&mut block.run_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Camera=>read_data_into_events(&mut data,&mut block.camera_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Setting=>read_data_into_events(&mut data,&mut block.setting_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Input=>read_data_into_events(&mut data,&mut self.input_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Output=>read_data_into_events(&mut data,&mut self.output_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Sound=>read_data_into_events(&mut data,&mut self.sound_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::World=>read_data_into_events(&mut data,&mut self.world_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Gravity=>read_data_into_events(&mut data,&mut self.gravity_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Run=>read_data_into_events(&mut data,&mut self.run_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Camera=>read_data_into_events(&mut data,&mut self.camera_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Setting=>read_data_into_events(&mut data,&mut self.setting_events,event_chunk_header.num_events as usize)?,
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
fn read_into_amortized<R:BinReaderExt>(mut data:R,block:&mut Block)->binrw::BinResult<()>{
|
||||
fn read_into_amortized<R:BinReaderExt>(&mut self,mut data:R)->binrw::BinResult<()>{
|
||||
// sad code duplication
|
||||
while let Ok(event_chunk_header)=data.read_le::<EventChunkHeader>(){
|
||||
match event_chunk_header.event_type{
|
||||
EventType::Input=>read_data_into_events_amortized(&mut data,&mut block.input_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Output=>read_data_into_events_amortized(&mut data,&mut block.output_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Sound=>read_data_into_events_amortized(&mut data,&mut block.sound_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::World=>read_data_into_events_amortized(&mut data,&mut block.world_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Gravity=>read_data_into_events_amortized(&mut data,&mut block.gravity_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Run=>read_data_into_events_amortized(&mut data,&mut block.run_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Camera=>read_data_into_events_amortized(&mut data,&mut block.camera_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Setting=>read_data_into_events_amortized(&mut data,&mut block.setting_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Input=>read_data_into_events_amortized(&mut data,&mut self.input_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Output=>read_data_into_events_amortized(&mut data,&mut self.output_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Sound=>read_data_into_events_amortized(&mut data,&mut self.sound_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::World=>read_data_into_events_amortized(&mut data,&mut self.world_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Gravity=>read_data_into_events_amortized(&mut data,&mut self.gravity_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Run=>read_data_into_events_amortized(&mut data,&mut self.run_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Camera=>read_data_into_events_amortized(&mut data,&mut self.camera_events,event_chunk_header.num_events as usize)?,
|
||||
EventType::Setting=>read_data_into_events_amortized(&mut data,&mut self.setting_events,event_chunk_header.num_events as usize)?,
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
@ -607,7 +605,7 @@ impl<R:BinReaderExt> FileData<R>{
|
||||
}
|
||||
pub fn read_block_info_into_block(&mut self,block_info:BlockInfo,block:&mut Block)->Result<(),Error>{
|
||||
let data=self.block_reader(block_info)?;
|
||||
Block::read_into_amortized(data,block).map_err(Error::InvalidData)?;
|
||||
block.read_into_amortized(data).map_err(Error::InvalidData)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user