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
76
77
78
use std::io::Result as Res;

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

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

#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[repr(i32)]
pub enum PhysicsBehaviorType {
	/// todo: option
	Invalid = -1,
	Ground,
	Flying,
	Standard,
	Dynamic,
}

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct ModelBehaviorInfo {
	pub is_pickable: bool,
	pub physics_behavior_type: PhysicsBehaviorType,
	pub original_position: Vector3,
	pub original_rotation: Quaternion,
}

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct ModelEditingInfo {
	pub old_object_id: ObjId,
	pub player_editing_model: ObjId,
}

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct MutableModelBehaviorConstructionInfo {
	pub behavior_count: u32,
	pub is_paused: bool,
	pub model_editing_info: Option<ModelEditingInfo>,
}

#[derive(BitVariantTests, Debug, PartialEq, ReplicaSerde)]
pub struct MutableModelBehaviorConstruction {
	pub model_behavior_info: Option<ModelBehaviorInfo>,
	pub mutable_model_behavior_construction_info: Option<MutableModelBehaviorConstructionInfo>,
}

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

#[derive(Debug, PartialEq, ReplicaSerde)]
pub struct MutableModelBehaviorSerializationInfo {
	pub behavior_count: u32,
	pub is_paused: bool,
}

#[derive(BitVariantTests, Debug, PartialEq, ReplicaSerde)]
pub struct MutableModelBehaviorSerialization {
	pub model_behavior_info: Option<ModelBehaviorInfo>,
	pub mutable_model_behavior_serialization_info: Option<MutableModelBehaviorSerializationInfo>,
}

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

pub struct MutableModelBehaviorProtocol;

impl ComponentProtocol for MutableModelBehaviorProtocol {
	type Construction = MutableModelBehaviorConstruction;
	type Serialization = MutableModelBehaviorSerialization;
}