dis_rs/common/detonation/
model.rs

1use crate::common::detonation::builder::DetonationBuilder;
2use crate::common::model::{
3    DescriptorRecord, EntityId, EventId, Location, PduBody, VariableParameter, VectorF32,
4};
5use crate::common::{BodyInfo, Interaction};
6use crate::constants::VARIABLE_PARAMETER_RECORD_LENGTH;
7use crate::enumerations::{DetonationResult, PduType};
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11const BASE_DETONATION_BODY_LENGTH: u16 = 92;
12
13#[derive(Clone, Debug, Default, PartialEq)]
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
15pub struct Detonation {
16    pub source_entity_id: EntityId,
17    pub target_entity_id: EntityId,
18    pub exploding_entity_id: EntityId,
19    pub event_id: EventId,
20    pub velocity: VectorF32,
21    pub location_in_world_coordinates: Location,
22    pub descriptor: DescriptorRecord,
23    pub location_in_entity_coordinates: VectorF32,
24    pub detonation_result: DetonationResult,
25    pub variable_parameters: Vec<VariableParameter>,
26}
27
28impl Detonation {
29    #[must_use]
30    pub fn builder() -> DetonationBuilder {
31        DetonationBuilder::new()
32    }
33
34    #[must_use]
35    pub fn into_builder(self) -> DetonationBuilder {
36        DetonationBuilder::new_from_body(self)
37    }
38
39    #[must_use]
40    pub fn into_pdu_body(self) -> PduBody {
41        PduBody::Detonation(self)
42    }
43}
44
45impl BodyInfo for Detonation {
46    fn body_length(&self) -> u16 {
47        BASE_DETONATION_BODY_LENGTH
48            + (VARIABLE_PARAMETER_RECORD_LENGTH * (self.variable_parameters.len() as u16))
49    }
50
51    fn body_type(&self) -> PduType {
52        PduType::Detonation
53    }
54}
55
56impl Interaction for Detonation {
57    fn originator(&self) -> Option<&EntityId> {
58        Some(&self.source_entity_id)
59    }
60
61    fn receiver(&self) -> Option<&EntityId> {
62        Some(&self.target_entity_id)
63    }
64}