dis_rs/common/detonation/
model.rs1use crate::BodyRaw;
2use crate::common::detonation::builder::DetonationBuilder;
3use crate::common::model::{
4 EntityId, EventId, ExpendableDescriptor, ExplosionDescriptor, Location, MunitionDescriptor,
5 PduBody, VariableParameter, VectorF32,
6};
7use crate::common::{BodyInfo, Interaction};
8use crate::constants::VARIABLE_PARAMETER_RECORD_LENGTH;
9use crate::enumerations::{DetonationResult, PduType};
10use alloc::vec::Vec;
11#[cfg(feature = "serde")]
12use serde::{Deserialize, Serialize};
13
14const BASE_DETONATION_BODY_LENGTH: u16 = 92;
15
16#[derive(Clone, Debug, Default, PartialEq)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Detonation {
19 pub source_entity_id: EntityId,
20 pub target_entity_id: EntityId,
21 pub exploding_entity_id: EntityId,
22 pub event_id: EventId,
23 pub velocity: VectorF32,
24 pub location_in_world_coordinates: Location,
25 pub descriptor: DetonationDescriptor,
26 pub location_in_entity_coordinates: VectorF32,
27 pub detonation_result: DetonationResult,
28 pub variable_parameters: Vec<VariableParameter>,
29}
30
31impl BodyRaw for Detonation {
32 type Builder = DetonationBuilder;
33
34 fn builder() -> Self::Builder {
35 Self::Builder::new()
36 }
37
38 fn into_builder(self) -> Self::Builder {
39 Self::Builder::new_from_body(self)
40 }
41
42 fn into_pdu_body(self) -> PduBody {
43 PduBody::Detonation(self)
44 }
45}
46
47impl BodyInfo for Detonation {
48 fn body_length(&self) -> u16 {
49 BASE_DETONATION_BODY_LENGTH
50 + (VARIABLE_PARAMETER_RECORD_LENGTH * (self.variable_parameters.len() as u16))
51 }
52
53 fn body_type(&self) -> PduType {
54 PduType::Detonation
55 }
56}
57
58impl Interaction for Detonation {
59 fn originator(&self) -> Option<&EntityId> {
60 Some(&self.source_entity_id)
61 }
62
63 fn receiver(&self) -> Option<&EntityId> {
64 Some(&self.target_entity_id)
65 }
66}
67
68#[derive(Clone, Debug, PartialEq)]
70#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71pub enum DetonationDescriptor {
72 #[cfg_attr(feature = "serde", serde(rename = "munition"))]
73 Munition(MunitionDescriptor),
74 #[cfg_attr(feature = "serde", serde(rename = "explosion"))]
75 Explosion(ExplosionDescriptor),
76 #[cfg_attr(feature = "serde", serde(rename = "expendable"))]
77 Expendable(ExpendableDescriptor),
78}
79
80impl Default for DetonationDescriptor {
81 fn default() -> Self {
82 Self::Munition(MunitionDescriptor::default())
83 }
84}
85
86impl From<MunitionDescriptor> for DetonationDescriptor {
87 #[inline]
88 fn from(value: MunitionDescriptor) -> Self {
89 Self::Munition(value)
90 }
91}
92
93impl From<ExplosionDescriptor> for DetonationDescriptor {
94 #[inline]
95 fn from(value: ExplosionDescriptor) -> Self {
96 Self::Explosion(value)
97 }
98}
99
100impl From<ExpendableDescriptor> for DetonationDescriptor {
101 #[inline]
102 fn from(value: ExpendableDescriptor) -> Self {
103 Self::Expendable(value)
104 }
105}