dis_rs/common/fire/
model.rs1use crate::BodyRaw;
2use crate::common::model::{
3 EntityId, EventId, ExpendableDescriptor, Location, MunitionDescriptor, PduBody, VectorF32,
4};
5use crate::common::{BodyInfo, Interaction};
6use crate::enumerations::PduType;
7use crate::fire::builder::FireBuilder;
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11const FIRE_BODY_LENGTH: u16 = 84;
12
13#[derive(Clone, Debug, Default, PartialEq)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Fire {
19 pub firing_entity_id: EntityId,
20 pub target_entity_id: EntityId,
21 pub entity_id: EntityId,
22 pub event_id: EventId,
23 pub fire_mission_index: u32,
24 pub location_in_world: Location,
25 pub descriptor: FireDescriptor,
26 pub velocity: VectorF32,
27 pub range: f32,
28}
29
30impl BodyRaw for Fire {
31 type Builder = FireBuilder;
32
33 fn builder() -> Self::Builder {
34 Self::Builder::new()
35 }
36
37 fn into_builder(self) -> Self::Builder {
38 Self::Builder::new_from_body(self)
39 }
40
41 fn into_pdu_body(self) -> PduBody {
42 PduBody::Fire(self)
43 }
44}
45
46impl BodyInfo for Fire {
47 fn body_length(&self) -> u16 {
48 FIRE_BODY_LENGTH
49 }
50
51 fn body_type(&self) -> PduType {
52 PduType::Fire
53 }
54}
55
56impl Interaction for Fire {
57 fn originator(&self) -> Option<&EntityId> {
58 Some(&self.firing_entity_id)
59 }
60
61 fn receiver(&self) -> Option<&EntityId> {
62 Some(&self.target_entity_id)
63 }
64}
65
66#[derive(Clone, Debug, PartialEq)]
68#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69pub enum FireDescriptor {
70 #[cfg_attr(feature = "serde", serde(rename = "munition"))]
71 Munition(MunitionDescriptor),
72 #[cfg_attr(feature = "serde", serde(rename = "expendable"))]
73 Expendable(ExpendableDescriptor),
74}
75
76impl Default for FireDescriptor {
77 fn default() -> Self {
78 Self::Munition(MunitionDescriptor::default())
79 }
80}
81
82impl From<MunitionDescriptor> for FireDescriptor {
83 #[inline]
84 fn from(value: MunitionDescriptor) -> Self {
85 Self::Munition(value)
86 }
87}
88
89impl From<ExpendableDescriptor> for FireDescriptor {
90 #[inline]
91 fn from(value: ExpendableDescriptor) -> Self {
92 Self::Expendable(value)
93 }
94}