Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_InspectCasualtyWidget.c
Go to the documentation of this file.
1class SCR_InspectCasualtyWidget : SCR_InfoDisplayExtended
2{
3 const ResourceName INSPECT_CASUALTY_LAYOUT = "{11AC7D61FD4CF3F6}UI/layouts/Damage/InspectCasualtyMenu.layout";
4
7
9
10 protected const float UPDATE_FREQ = 0.5;
11 protected const float MAX_SHOW_DURATION = 5;
12 protected const string TARGET_BONE = "Spine4";
13 protected float m_fTimeTillUpdate;
14 protected float m_fTimeTillClose;
15 protected bool m_bShouldBeVisible;
16
17 //------------------------------------------------------------------------------------------------
18 override void DisplayStartDraw(IEntity owner)
19 {
22 }
23
24 //------------------------------------------------------------------------------------------------
25 override event void DisplayUpdate(IEntity owner, float timeSlice)
26 {
27 if (m_fTimeTillClose < 0)
29 else
30 m_fTimeTillClose -= timeSlice;
31
32 if (m_fTimeTillUpdate > 0)
33 {
34 m_fTimeTillUpdate -= timeSlice;
35 }
36 else
37 {
40 }
41
43 }
44
45 //------------------------------------------------------------------------------------------------
47 bool ShowInspectCasualtyWidget(IEntity targetCharacter)
48 {
50 return false;
51
52 ChimeraCharacter char = ChimeraCharacter.Cast(targetCharacter);
53 if (!char)
54 return false;
55
56 CharacterControllerComponent targetController = char.GetCharacterController();
57 if (!targetController)
58 return false;
59
62
63 return true;
64 }
65
66 //------------------------------------------------------------------------------------------------
68 protected void UpdateTarget()
69 {
70 if (!m_Target)
71 {
73 return;
74 }
75
77 if (!char)
78 return;
79
80 CharacterControllerComponent controller = char.GetCharacterController();
81 if (controller.GetLifeState() == ECharacterLifeState.DEAD)
82 {
84 return;
85 }
86
88 }
89
90 //------------------------------------------------------------------------------------------------
92 protected void UpdateWidgetData()
93 {
95 return;
96
97 string sName;
99
100 if (GetGame().GetPlatformService().GetLocalPlatformKind() == PlatformKind.PSN)
101 {
102 PlayerManager playerMgr = GetGame().GetPlayerManager();
103
104 if (playerMgr && playerMgr.GetPlatformKind(playerMgr.GetPlayerIdFromControlledEntity(m_Target)) == PlatformKind.PSN)
105 sName = string.Format("<color rgba=%1><image set='%2' name='%3' scale='%4'/></color>", UIColors.FormatColor(GUIColors.ENABLED), UIConstants.ICONS_IMAGE_SET, UIConstants.PLATFROM_PLAYSTATION_ICON_NAME, 2) + sName;
106 else
107 sName = string.Format("<color rgba=%1><image set='%2' name='%3' scale='%4'/></color>", UIColors.FormatColor(GUIColors.ENABLED), UIConstants.ICONS_IMAGE_SET, UIConstants.PLATFROM_GENERIC_ICON_NAME, 2) + sName;
108 }
109
110 float bleedingRate;
111 int groupDamageIntensity;
112 bool regenerating, isTourniquetted, isSalineBagged, isMorphined;
113 string damageIntensity, damageIntensityText, bleedingIntensityText;
114 array<bool> hZGroupsBleeding = {};
115
116 SCR_InventoryHitZonePointUI hitZonePointUI = new SCR_InventoryHitZonePointUI();
117 GetDamageInfo(hitZonePointUI, m_Target, bleedingRate, hZGroupsBleeding, groupDamageIntensity, regenerating, isTourniquetted, isSalineBagged, isMorphined);
118 hitZonePointUI.GetDamageInfoTexts(EHitZoneGroup.VIRTUAL, groupDamageIntensity, bleedingRate, damageIntensity, damageIntensityText, bleedingIntensityText);
119
121 if (damageInfoUI)
122 {
123 damageInfoUI.SetName(sName);
124 damageInfoUI.SetDamageStateVisible(groupDamageIntensity, regenerating, damageIntensity, damageIntensityText);
125 damageInfoUI.SetBleedingStateVisible(bleedingRate > 0, bleedingIntensityText);
126 damageInfoUI.SetTourniquetStateVisible(isTourniquetted);
127 damageInfoUI.SetSalineBagStateVisible(isSalineBagged);
128 damageInfoUI.SetMorphineStateVisible(isMorphined);
129 damageInfoUI.SetFractureStateVisible(0, 0);
130 }
131 }
132
133 //------------------------------------------------------------------------------------------------
135 protected void UpdateWidget()
136 {
138 return;
139
140 vector boneVector[4];
141 m_Target.GetAnimation().GetBoneMatrix(m_Target.GetAnimation().GetBoneIndex(TARGET_BONE), boneVector);
142
143 vector WPPos = boneVector[3] + m_Target.GetOrigin();
144 vector pos = GetGame().GetWorkspace().ProjWorldToScreen(WPPos, GetGame().GetWorld());
145
146 // Handle off-screen coords
147 WorkspaceWidget workspace = GetGame().GetWorkspace();
148 int winX = workspace.GetWidth();
149 int winY = workspace.GetHeight();
150 int posX = workspace.DPIScale(pos[0]);
151 int posY = workspace.DPIScale(pos[1]);
152
153 // If widget off screen, remove widget
154 if (posX < 0 || posX > winX || posY > winY || posY < 0)
155 {
157 return;
158 }
159
160 FrameSlot.SetPos(m_wCasualtyInspectWidget.GetChildren(), pos[0], pos[1]);
161
162 float dist = vector.Distance(GetGame().GetPlayerController().GetControlledEntity().GetOrigin(), WPPos);
163 if (dist >= 4)
164 {
166 return;
167 }
168
169 float distanceOpacityReduction = 1;
170
171 if (dist <= 3)
172 distanceOpacityReduction = 0;
173 else
174 distanceOpacityReduction = Math.InverseLerp(3, 4, dist);
175
176 m_wCasualtyInspectWidget.SetOpacity(1 - distanceOpacityReduction);
177 }
178
179 //------------------------------------------------------------------------------------------------
180 protected void GetDamageInfo(SCR_InventoryHitZonePointUI hitZonePointUI, IEntity targetEntity, inout float bleedingRate, inout array<bool> hZGroupsBleeding, inout int damageIntensity, inout bool regenerating, inout bool isTourniquetted, inout bool isSalineBagged, inout bool isMorphined)
181 {
182 ChimeraCharacter character = ChimeraCharacter.Cast(targetEntity);
183 if (!character)
184 return;
185
186 SCR_CharacterDamageManagerComponent damageMan = SCR_CharacterDamageManagerComponent.Cast(character.GetDamageManager());
187 if (!damageMan)
188 return;
189
190 float defaultHZHealth = damageMan.GetHealthScaled();
191 bleedingRate = damageMan.GetBloodHitZone().GetTotalBleedingAmount();
192 if (bleedingRate)
193 {
194 hZGroupsBleeding = {};
195 hZGroupsBleeding.Resize(damageMan.LIMB_GROUPS.Count());
196
197 foreach (ECharacterHitZoneGroup group : damageMan.LIMB_GROUPS)
198 {
199 hZGroupsBleeding[damageMan.LIMB_GROUPS.Find(group)] = damageMan.GetGroupDamageOverTime(group, EDamageType.BLEEDING) != 0;
200 }
201 }
202
203 array<EHitZoneGroup> limbGroups = {};
204 damageMan.GetAllLimbs(limbGroups);
205 foreach (EHitZoneGroup group : limbGroups)
206 {
207 if (!isTourniquetted)
208 isTourniquetted = damageMan.GetGroupTourniquetted(group);
209
210 if (!isSalineBagged)
211 isSalineBagged = damageMan.GetGroupSalineBagged(group);
212
213 if (!isMorphined)
214 {
215 array<ref SCR_PersistentDamageEffect> effects = damageMan.GetAllPersistentEffectsOfType(SCR_MorphineDamageEffect);
216 isMorphined = !effects.IsEmpty();
217 }
218
219 if (!regenerating)
220 regenerating = damageMan.GetGroupDamageOverTime(group, EDamageType.HEALING) != 0 || damageMan.GetGroupDamageOverTime(group, EDamageType.REGENERATION) != 0;
221 }
222
223 if (defaultHZHealth == 1)
224 damageIntensity = 0;
225 else if (defaultHZHealth < hitZonePointUI.m_fLowDamageThreshold)
226 damageIntensity = 4;
227 else if (defaultHZHealth < hitZonePointUI.m_fMediumDamageThreshold)
228 damageIntensity = 3;
229 else if (defaultHZHealth < hitZonePointUI.m_fHighDamageThreshold)
230 damageIntensity = 2;
231 else
232 damageIntensity = 1;
233 }
234
235 //------------------------------------------------------------------------------------------------
236 protected void GetCasualtyName(inout string sName, IEntity targetCharacter)
237 {
238 string sFormat, sAlias, sSurname;
239 int playerID = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(targetCharacter);
240 if (playerID > 0)
241 {
242 PlayerManager playerMgr = GetGame().GetPlayerManager();
243 if (playerMgr)
244 sName = SCR_PlayerNamesFilterCache.GetInstance().GetPlayerDisplayName(playerID);
245 }
246 else
247 {
248 SCR_CharacterIdentityComponent scrCharIdentity = SCR_CharacterIdentityComponent.Cast(targetCharacter.FindComponent(SCR_CharacterIdentityComponent));
249 if (scrCharIdentity)
250 {
251 scrCharIdentity.GetFormattedFullName(sFormat, sName, sAlias, sSurname);
252 sName = sName + " " + sSurname;
253 }
254 else
255 {
256 CharacterIdentityComponent charIdentity = CharacterIdentityComponent.Cast(targetCharacter.FindComponent(CharacterIdentityComponent));
257 if (charIdentity && charIdentity.GetIdentity())
258 sName = charIdentity.GetIdentity().GetName();
259 }
260 }
261 }
262
263 //------------------------------------------------------------------------------------------------
264 override protected void DisplayOnSuspended()
265 {
267 }
268
269 //------------------------------------------------------------------------------------------------
270 void SetTarget(IEntity target)
271 {
272 m_Target = target;
273 }
274
275 //------------------------------------------------------------------------------------------------
276 bool IsActive()
277 {
278 return m_Target && m_wCasualtyInspectWidget && m_wCasualtyInspectWidget.GetOpacity() != 0;
279 }
280
281 //------------------------------------------------------------------------------------------------
282 protected void DisableWidget()
283 {
285 m_wCasualtyInspectWidget.SetVisible(false);
286
287 m_Target = null;
288 SetEnabled(false);
289 m_bShouldBeVisible = false;
291 }
292
293 //------------------------------------------------------------------------------------------------
294 protected void EnableWidget()
295 {
297 m_wCasualtyInspectWidget.SetVisible(true);
298
299 SetEnabled(true);
300 m_bShouldBeVisible = true;
301 }
302
303 //------------------------------------------------------------------------------------------------
304 override void DisplayOnResumed()
305 {
307 m_wCasualtyInspectWidget.SetVisible(false);
308 }
309}
EHitZoneGroup
ArmaReforgerScripted GetGame()
Definition game.c:1398
PlatformKind
Definition PlatformKind.c:8
vector GetOrigin()
Widget GetRootWidget()
proto external Managed FindComponent(typename typeName)
Definition Math.c:13
static ref array< ECharacterHitZoneGroup > LIMB_GROUPS
bool GetGroupSalineBagged(ECharacterHitZoneGroup hitZoneGroup)
bool GetGroupTourniquetted(ECharacterHitZoneGroup hitZoneGroup)
static void GetAllLimbs(notnull out array< ECharacterHitZoneGroup > limbs)
override float GetGroupDamageOverTime(ECharacterHitZoneGroup hitZoneGroup, EDamageType damageType)
void UpdateTarget()
Check if target is still alive and update widget if so.
void UpdateWidgetData()
Gather and update data of target character into widget.
override void DisplayStartDraw(IEntity owner)
override event void DisplayUpdate(IEntity owner, float timeSlice)
void UpdateWidget()
Update widget position and opacity.
void GetDamageInfo(SCR_InventoryHitZonePointUI hitZonePointUI, IEntity targetEntity, inout float bleedingRate, inout array< bool > hZGroupsBleeding, inout int damageIntensity, inout bool regenerating, inout bool isTourniquetted, inout bool isSalineBagged, inout bool isMorphined)
SCR_CharacterDamageManagerComponent m_CharDamageManager
void GetCasualtyName(inout string sName, IEntity targetCharacter)
bool ShowInspectCasualtyWidget(IEntity targetCharacter)
Start showing the widget.
void SetDamageStateVisible(bool visible, bool regenerating, string iconIntensity, string damageText)
void SetBleedingStateVisible(bool visible, string bleedingText)
void SetFractureStateVisible(bool armFractured, bool legFractured)
SCR_EditableEntityComponent GetControlledEntity()
ECharacterLifeState
void SetEnabled(bool enabled)
proto external PlayerController GetPlayerController()
EDamageType
Definition EDamageType.c:13