dis_rs/common/detonation/
model.rs1use 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}