summaryrefslogtreecommitdiff
path: root/shared/src/packets.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-08 00:01:07 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-08 00:01:07 +0100
commit7e06efee8b33fb8619aa5e50afc8728fd330f39d (patch)
treedb8ffedb2d52d74438c104be731966d6507ed968 /shared/src/packets.rs
parent30ef8aeb1fdf7f3686442d758ee77874aa29d53e (diff)
downloadweareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar
weareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar.bz2
weareserver-7e06efee8b33fb8619aa5e50afc8728fd330f39d.tar.zst
fix image ser bug
Diffstat (limited to 'shared/src/packets.rs')
-rw-r--r--shared/src/packets.rs124
1 files changed, 10 insertions, 114 deletions
diff --git a/shared/src/packets.rs b/shared/src/packets.rs
index 66b0b55..a35b4e9 100644
--- a/shared/src/packets.rs
+++ b/shared/src/packets.rs
@@ -14,7 +14,10 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::resources::{Prefab, PrefabIndex};
+use crate::{
+ helper::ReadWrite,
+ resources::{Prefab, PrefabIndex},
+};
use anyhow::{Result, bail};
use glam::Vec3A;
use std::{
@@ -61,17 +64,6 @@ pub enum Packet {
PrefabName(Resource<Prefab>, String),
}
-pub trait ReadWrite: Sized {
- fn write(&self, w: &mut dyn Write) -> Result<()>;
- fn read(r: &mut dyn Read) -> Result<Self>;
-
- fn write_alloc(&self) -> Vec<u8> {
- let mut buf = Vec::new();
- self.write(&mut buf).unwrap();
- buf
- }
-}
-
impl Object {
pub fn new() -> Self {
Self(rand::random())
@@ -152,16 +144,16 @@ impl ReadWrite for Packet {
0x00 => Packet::Connect(read_u128(r)?),
0x01 => Packet::RequestResource(Resource::read(r)?),
0x02 => Packet::RespondResource(Data::read(r)?),
- 0x03 => Packet::Add(Object(read_u128(r)?), Resource::read(r)?),
- 0x04 => Packet::Remove(Object(read_u128(r)?)),
+ 0x03 => Packet::Add(Object::read(r)?, Resource::read(r)?),
+ 0x04 => Packet::Remove(Object::read(r)?),
0x05 => Packet::Position(
- Object(read_u128(r)?),
+ Object::read(r)?,
Vec3A::new(f32::read(r)?, f32::read(r)?, f32::read(r)?),
Vec3A::new(f32::read(r)?, f32::read(r)?, f32::read(r)?),
),
- 0x06 => Packet::Pose(Object(read_u128(r)?), read_params(r)?),
- 0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)),
- 0x08 => Packet::Sound(Object(read_u128(r)?), Data::read(r)?),
+ 0x06 => Packet::Pose(Object::read(r)?, read_params(r)?),
+ 0x07 => Packet::Parent(Object::read(r)?, Object::read(r)?),
+ 0x08 => Packet::Sound(Object::read(r)?, Data::read(r)?),
0x09 => Packet::PrefabIndex(Resource::read(r)?),
0x0a => Packet::PrefabName(Resource::read(r)?, String::read(r)?),
_ => {
@@ -179,68 +171,7 @@ fn read_u128(r: &mut dyn Read) -> Result<u128> {
r.read_exact(&mut buf)?;
Ok(u128::from_be_bytes(buf))
}
-impl<T> ReadWrite for Resource<T> {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.0)?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut s = Self([0; 32], PhantomData);
- r.read_exact(&mut s.0)?;
- Ok(s)
- }
-}
-impl ReadWrite for Object {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.0.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut s = [0; 16];
- r.read_exact(&mut s)?;
- Ok(Object(u128::from_be_bytes(s)))
- }
-}
-
-impl ReadWrite for Data {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- self.0.write(w)
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- Ok(Self(Vec::read(r)?))
- }
-}
-impl ReadWrite for Vec<u8> {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&(self.len() as u32).to_be_bytes())?;
- w.write_all(&self)?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size = [0; 4];
- r.read_exact(&mut size)?;
- let size = u32::from_be_bytes(size);
- let mut buf = vec![0; size as usize];
- r.read_exact(&mut buf)?;
- Ok(buf)
- }
-}
-impl ReadWrite for String {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&(self.len() as u32).to_be_bytes())?;
- w.write_all(self.as_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size = [0; 4];
- r.read_exact(&mut size)?;
- let size = u32::from_be_bytes(size);
- let mut buf = vec![0; size as usize];
- r.read_exact(&mut buf)?;
- Ok(String::from_utf8(buf)?)
- }
-}
fn read_params(r: &mut dyn Read) -> Result<Vec<f32>> {
let mut size = [0; 2];
r.read_exact(&mut size)?;
@@ -252,29 +183,6 @@ fn read_params(r: &mut dyn Read) -> Result<Vec<f32>> {
Ok(v)
}
-impl ReadWrite for f32 {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut buf = [0; 4];
- r.read_exact(&mut buf)?;
- Ok(f32::from_be_bytes(buf))
- }
-}
-impl ReadWrite for u32 {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut buf = [0; 4];
- r.read_exact(&mut buf)?;
- Ok(u32::from_be_bytes(buf))
- }
-}
-
impl<T> Display for Resource<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
@@ -293,18 +201,6 @@ impl<T> Debug for Resource<T> {
}
}
-impl<T: ReadWrite, const N: usize> ReadWrite for [T; N] {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- for e in self {
- e.write(w)?;
- }
- Ok(())
- }
-
- fn read(r: &mut dyn Read) -> Result<Self> {
- [(); N].try_map(|()| T::read(r))
- }
-}
impl Debug for Data {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("Data").finish_non_exhaustive()