Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_RotorHitZone.c
Go to the documentation of this file.
1//---- REFACTOR NOTE START: This code will need to be refactored as current implementation is not conforming to the standards ----
2// TODO: Separate file
4{
5 MINOR = 3,
6 MAJOR = 4,
7 CRITICAL = 5
8}
9//---- REFACTOR NOTE END ----
10
11class SCR_RotorHitZone : SCR_VehicleHitZone
12{
13 [Attribute(defvalue: "-1", uiwidget: UIWidgets.Auto, desc: "Rotor ID", category: "Rotor Damage")]
14 protected int m_iRotorId;
15
16 [Attribute(desc: "Rotor collision detection root point", category: "Rotor Damage")]
18
19 [Attribute(uiwidget: UIWidgets.Slider, desc: "Rotor radius measured up from root in Rotor Info space\n[m]", params: "0.5 50 0.01", category: "Helicopter Damage")]
20 protected float m_fRotorRadius;
21
22 [Attribute(uiwidget: UIWidgets.Slider, desc: "Rotor thickness measured up from root in Rotor Info space\n[m]", params: "0.1 10 0.01", category: "Helicopter Damage")]
23 protected float m_fRotorThickness;
24
25 [Attribute(uiwidget: UIWidgets.Slider, desc: "Average blade width measured up from side to side at the tip of the blade\n[m]", params: "0.1 1000 0.01", category: "Helicopter Damage")]
26 protected float m_fBladeWidth;
27
28 [Attribute(uiwidget: UIWidgets.EditBox, desc: "Amount of blades on this rotor", category: "Helicopter Damage")]
29 protected int m_iBladeCount;
30
31 [Attribute(defvalue: "0.9", uiwidget: UIWidgets.Auto, desc: "Efficiency with minor damage state", category: "Rotor Damage")]
32 protected float m_fEfficiencyMinor;
33
34 [Attribute(defvalue: "0.8", uiwidget: UIWidgets.Auto, desc: "Efficiency with major damage state", category: "Rotor Damage")]
35 protected float m_fEfficiencyMajor;
36
37 [Attribute(defvalue: "0.6", uiwidget: UIWidgets.Auto, desc: "Efficiency with critical damage state", category: "Rotor Damage")]
38 protected float m_fEfficiencyCritical;
39
41
42 //------------------------------------------------------------------------------------------------
43 override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent)
44 {
45 super.OnInit(pOwnerEntity, pManagerComponent);
46
48 m_RotorPointInfo.Init(pOwnerEntity);
49
50 SetRotorIndex(m_iRotorId);
51 }
52
53 //------------------------------------------------------------------------------------------------
55 float RotorHitChance(vector worldPosition)
56 {
57 if (!m_RotorPointInfo || !m_Simulation || m_fBladeWidth <= 0 || m_iBladeCount < 1)
58 return 1;
59
60 if (m_Simulation.RotorGetState(GetRotorIndex()) != RotorState.SPINNING)
61 return 1;
62
63 vector transform[4];
64 m_RotorPointInfo.GetTransform(transform);
65 vector relativePosition = worldPosition.InvMultiply4(transform);
66
67 float distanceFromAxis = vector.DistanceXZ(relativePosition, vector.Zero);
68 if (distanceFromAxis == 0)
69 return 1;
70
71 return m_fBladeWidth * m_iBladeCount / (Math.PI2 * distanceFromAxis);
72 }
73
74 //------------------------------------------------------------------------------------------------
75 override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP)
76 {
77 super.OnDamageStateChanged(newState, previousDamageState, isJIP);
78
80 }
81
82 //------------------------------------------------------------------------------------------------
84 {
85 return m_fRotorRadius;
86 }
87
88 //------------------------------------------------------------------------------------------------
90 {
91 return m_iBladeCount;
92 }
93
94
95 //------------------------------------------------------------------------------------------------
97 {
98 return m_RotorPointInfo;
99 }
100
101 //------------------------------------------------------------------------------------------------
103 {
104 return m_iRotorId;
105 }
106
107 //------------------------------------------------------------------------------------------------
109 void SetRotorIndex(int id)
110 {
111 m_iRotorId = id;
112 Vehicle vehicle = Vehicle.Cast(GetOwner().GetRootParent());
113 if (!vehicle)
114 return;
115
116 // Vehicle.GetDamageManager() may not return damage manager during hitzone init
118 if (damageManager)
119 damageManager.RegisterVehicleHitZone(this);
120
122 }
123
124 //------------------------------------------------------------------------------------------------
126 {
127 Vehicle vehicle = Vehicle.Cast(GetOwner().GetRootParent());
128 if (!vehicle)
129 return;
130
131 SCR_VehicleDamageManagerComponent damageManager = SCR_VehicleDamageManagerComponent.Cast(vehicle.GetDamageManager());
132 if (damageManager)
133 damageManager.UpdateVehicleState();
134 }
135
136 //------------------------------------------------------------------------------------------------
139 {
140 float efficiency = 1;
141
142 SCR_ERotorDamageState state = GetDamageState();
143 if (state == SCR_ERotorDamageState.DESTROYED)
144 efficiency = 0;
145 else if (state == SCR_ERotorDamageState.CRITICAL)
146 efficiency = m_fEfficiencyCritical;
147 else if (state == SCR_ERotorDamageState.MAJOR)
148 efficiency = m_fEfficiencyMajor;
149 else if (state == SCR_ERotorDamageState.MINOR)
150 efficiency = m_fEfficiencyMinor;
151
152 return efficiency;
153 }
154
155 //------------------------------------------------------------------------------------------------
158 {
159 return m_Simulation && m_Simulation.RotorGetState(m_iRotorId) == RotorState.SPINNING;
160 }
161
162 //------------------------------------------------------------------------------------------------
164 bool HasCollision(vector worldPosition)
165 {
166 if (!m_RotorPointInfo)
167 return false;
168
169 if (m_fRotorRadius <= 0)
170 return false;
171
172 if (m_fRotorThickness <= 0)
173 return false;
174
175 if (m_Simulation && m_Simulation.RotorGetState(m_iRotorId) != RotorState.SPINNING)
176 return false;
177
178 vector transform[4];
179 m_RotorPointInfo.GetTransform(transform);
180 vector relativePosition = worldPosition.InvMultiply4(transform);
181
182 // Check if position is below rotor or above rotor thickness
183 if (m_fRotorThickness > 0 && relativePosition[1] < 0 || relativePosition[1] > m_fRotorThickness)
184 return false;
185
186 // Check if position is inside rotor cylinder
187 return vector.DistanceSqXZ(relativePosition, vector.Zero) <= m_fRotorRadius * m_fRotorRadius;
188 }
189
190#ifdef WORKBENCH
191 //------------------------------------------------------------------------------------------------
193 override void DrawDebug()
194 {
195 if (!m_RotorPointInfo)
196 return;
197
198 if (m_fRotorRadius <= 0)
199 return;
200
201 if (m_fRotorThickness <= 0)
202 return;
203
204 vector transform[4];
205 m_RotorPointInfo.GetWorldTransform(transform);
206 vector transformTop[4] = transform;
207 transformTop[3] = transformTop[3] + transformTop[1] * m_fRotorThickness;
208
209 ShapeFlags shapeFlags = ShapeFlags.ONCE | ShapeFlags.NOZBUFFER | ShapeFlags.TRANSP | ShapeFlags.DOUBLESIDE | ShapeFlags.NOOUTLINE;
210
212 Shape.CreateArrow(transform[3], transformTop[3], 0, Color.DARK_MAGENTA, shapeFlags);
213
215 SCR_Shape.DrawCircle(transform, m_fRotorRadius, Color.DARK_RED, COLOR_RED_A, shapeFlags);
216 Shape.CreateArrow(transform[3] - transform[0] * m_fRotorRadius, transform[3], 0, Color.DARK_RED, shapeFlags);
217 Shape.CreateArrow(transform[3] + transform[0] * m_fRotorRadius, transform[3], 0, Color.DARK_RED, shapeFlags);
218 Shape.CreateArrow(transform[3] - transform[2] * m_fRotorRadius, transform[3], 0, Color.DARK_RED, shapeFlags);
219 Shape.CreateArrow(transform[3] + transform[2] * m_fRotorRadius, transform[3], 0, Color.DARK_RED, shapeFlags);
220
222 SCR_Shape.DrawCircle(transformTop, m_fRotorRadius, Color.DARK_BLUE, COLOR_BLUE_A, shapeFlags);
223 Shape.CreateArrow(transformTop[3] - transform[0] * m_fRotorRadius, transformTop[3], 0, Color.DARK_BLUE, shapeFlags);
224 Shape.CreateArrow(transformTop[3] + transform[0] * m_fRotorRadius, transformTop[3], 0, Color.DARK_BLUE, shapeFlags);
225 Shape.CreateArrow(transformTop[3] - transform[2] * m_fRotorRadius, transformTop[3], 0, Color.DARK_BLUE, shapeFlags);
226 Shape.CreateArrow(transformTop[3] + transform[2] * m_fRotorRadius, transformTop[3], 0, Color.DARK_BLUE, shapeFlags);
227 }
228#endif
229}
AddonBuildInfoTool id
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
int m_iBladeCount
int GetRotorIndex()
float GetEfficiency()
Set wheel parameters when damage exceeds thresholds.
void SetRotorIndex(int id)
Register rotor hitzone with damage manager.
SCR_ERotorDamageState
float RotorHitChance(vector worldPosition)
Calculates the chance the rotor was hit by a bullet between 0 and 1.
bool IsSpinning()
Check if rotor is spinning.
float m_fEfficiencyMinor
float m_fEfficiencyMajor
float m_fEfficiencyCritical
ref PointInfo m_RotorPointInfo
float GetRotorRadius()
bool HasCollision(vector worldPosition)
Check if world position is within rotor disc.
PointInfo GetPointInfo()
int GetBladeCount()
void UpdateRotorState()
void SCR_VehicleDamageManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
VehicleBaseSimulation m_Simulation
Definition Math.c:13
PointInfo - allows to define position.
Definition PointInfo.c:9
override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP)
Kill occupants and start destruction.
IEntity GetOwner()
Definition SCR_HitZone.c:42
enum EPhysicsLayerPresets Vehicle
Definition gameLib.c:24
const int COLOR_BLUE_A
Definition constants.c:28
const int COLOR_RED_A
Definition constants.c:26
ShapeFlags
Definition ShapeFlags.c:13
SCR_FieldOfViewSettings Attribute
EDamageState
RotorState
Definition RotorState.c:13