1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use std::io::Result as Res;

use endio::{Deserialize, Serialize};
use endio_bit::BEBitWriter;
use lu_packets_derive::{BitVariantTests, ReplicaSerde};

use crate::world::{Vector3, Quaternion};
use super::{ComponentConstruction, ComponentProtocol, ComponentSerialization};

#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[repr(u32)]
pub enum ClimbingProperty {
	None,
	Ladder,
	ClimbWall,
	ClimbWallStick,
}

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct VelocityInfo {
	pub linear_velocity: Vector3,
	pub angular_velocity: Vector3,
}

#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[repr(u32)]
pub enum MotionType {
	Dynamic = 1,
	SphereInertia,
	BoxInertia,
	Keyframed,
	Fixed,
	ThinBoxInertia,
}

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct PositionRotationInfo {
	pub position: Vector3,
	pub rotation: Quaternion,
}

#[derive(BitVariantTests, Debug, PartialEq, ReplicaSerde)]
pub struct SimplePhysicsConstruction {
	pub is_climbable: bool,
	pub climbing_property: ClimbingProperty,
	pub velocity_info: Option<VelocityInfo>,
	pub motion_type: Option<MotionType>,
	pub position_rotation_info: Option<PositionRotationInfo>,
}

#[derive(BitVariantTests, Debug, PartialEq, ReplicaSerde)]
pub struct SimplePhysicsSerialization {
	pub velocity_info: Option<VelocityInfo>,
	pub motion_type: Option<MotionType>,
	pub position_rotation_info: Option<PositionRotationInfo>,
}

impl ComponentConstruction for SimplePhysicsConstruction {
	fn ser(&self, writer: &mut BEBitWriter<Vec<u8>>) -> Res<()> {
		Serialize::serialize(self, writer)
	}
}

impl ComponentSerialization for SimplePhysicsSerialization {
	fn ser(&self, writer: &mut BEBitWriter<Vec<u8>>) -> Res<()> {
		Serialize::serialize(self, writer)
	}
}

pub struct SimplePhysicsProtocol;

impl ComponentProtocol for SimplePhysicsProtocol {
	type Construction = SimplePhysicsConstruction;
	type Serialization = SimplePhysicsSerialization;
}