Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_VonDisplay.c
Go to the documentation of this file.
1//------------------------------------------------------------------------------------------------
3class TransmissionData
5 // Widgets
9 bool m_bForceUpdate; // when transmission update is required
10 bool m_bVisible; // element visible, false if widget not visible
11 bool m_bIsActive; // active, false when widget starts fade out
12 bool m_bIsAnimating; // in process of fade in/out
14 int m_iPlayerID; // incoming tranmissions playerID
15 float m_fAlpha; // opacity
16 float m_fActiveTimeout; // delay before active element starts fading
17 float m_fFrequency; // current frequency
18 float m_fQuality;
19 IEntity m_Entity; // transmitting character
23
24 //------------------------------------------------------------------------------------------------
25 // Hide transmission, skip animation
26 void HideTransmission()
27 {
28 m_fAlpha = 0;
29 m_bIsActive = false;
30 m_bIsAnimating = false;
32 m_bVisible = false;
34 m_wBaseWidget.SetVisible(false);
35 }
36
37 //------------------------------------------------------------------------------------------------
38 void TransmissionData(Widget base, int iPlayerID)
39 {
40 m_wBaseWidget = base;
41 m_wBaseWidget.SetOpacity(0);
42
43 m_Widgets = new SCR_VoNOverlay_ElementWidgets();
44 m_Widgets.Init(m_wBaseWidget);
45
46 m_iPlayerID = iPlayerID;
47 }
48}
49
50//------------------------------------------------------------------------------------------------
52class SCR_VonDisplay : SCR_InfoDisplayExtended
53{
54 [Attribute(UIConstants.ICONS_IMAGE_SET)]
55 protected string m_sImageSet;
56
57 [Attribute(UIConstants.ICONS_GLOW_IMAGE_SET)]
58 protected string m_sImageSetGlow;
59
60 [Attribute("{25221F619214A722}UI/layouts/HUD/VON/VoNOverlay_Element.layout")]
62
63 [Attribute(defvalue: "1", desc: "Show enemy names in radio and direct talk?")]
64 protected bool m_bShowEnemyNames;
65
66 const string ICON_DIRECT_SPEECH = "VON_directspeech";
67 const string ICON_RADIO_HINT = "VON_radio";
68 const string ICON_RADIO = "VON_frequency";
69 const string ICON_RADIO_MUTED = "sound-off";
70 const string ICON_SERVER_DISABLE_HINT = "server-locked";
71
72 const string LABEL_FREQUENCY_UNITS = "#AR-VON_FrequencyUnits_MHz";
73 const string LABEL_UNKNOWN_SOURCE = "#AR-VON_UnknownSource";
74 const string LABEL_CHANNEL_PLATOON = "#AR-VON_ChannelPlatoon-UC";
75 const string WIDGET_INCOMING = "VonIncoming";
76 const string WIDGET_TRANSMIT = "VonTransmitting";
77 const string WIDGET_OVERFLOW = "VonAdditional";
78 const string WIDGET_OVERFLOW_TEXT = "number";
79 const string WIDGET_SELECTED_ROOT = "VonSelected";
80 const string WIDGET_SELECTED_ICON = "Selected_Icon";
81 const string WIDGET_SELECTED_ICONGLOW = "Selected_IconGlow";
82 const string WIDGET_SELECTED_VON = "Selected_VONChannel";
83 const string WIDGET_SELECTED_TEXT = "Selected_Text";
84
85 static const ref Color COLOR_WHITE = Color.FromSRGBA(255, 255, 255, 255);
86
87 protected int m_iTransmissionSlots = 4; // max amount of receiving transmissions
88 const float FADEOUT_TIMER_THRESHOLD = 1;
89 const float FADEIN_SPEED = 10;
90 const float FADEOUT_SPEED = 5;
91 const int SELECTED_HINT_FADE_SPEED = 3000; // ms
92 const int HEIGHT_DIVIDER = 35;
93
94 protected bool m_bIsVONUIDisabled;
95 protected bool m_bIsVONDirectDisabled;
96 protected bool m_bIsDirectToggled; // direct speech toggle state
97 protected bool m_bIsChannelToggled; // channel toggle EFireState
98
99 protected ref TransmissionData m_OutTransmission; // outgoing transmission data class
100 protected ref array<Widget> m_aWidgetsIncomingVON = {}; // available widgets for receiving transmission display
101 protected ref array<ref TransmissionData> m_aTransmissions = {}; // array of existing incoming transmission data classes
102 protected ref map<int, TransmissionData> m_aTransmissionMap = new map<int, TransmissionData>; // map for lookup when transmission is received
103 protected ref array<ref TransmissionData> m_aAdditionalSpeakers = {}; // array of additional speakers that cant be displayed
104
106 protected SCR_VONController m_VONController;
109
119
120 protected const string LABEL_ROLE_FORMAT = "(%1)";
121
122 //------------------------------------------------------------------------------------------------
125 {
126 return m_aTransmissions.Count();
127 }
128
129 //------------------------------------------------------------------------------------------------
132 {
133 return m_OutTransmission != null && m_OutTransmission.m_bIsActive;
134 }
135
136 //------------------------------------------------------------------------------------------------
138 event void OnCapture(BaseTransceiver transmitter)
139 {
140 if (!m_wRoot)
141 return;
142
143 int frequency;
144
145 if (transmitter) // can be null when using direct speech
146 frequency = transmitter.GetFrequency();
147
148 // update only when first activation / device changed / frequency changed
149 if (m_OutTransmission.m_bForceUpdate == true
150 || m_OutTransmission.m_bIsActive == false
151 || m_OutTransmission.m_RadioTransceiver != transmitter
152 || (transmitter && m_OutTransmission.m_fFrequency != transmitter.GetFrequency())
153 )
154 {
155 UpdateTransmission(m_OutTransmission, transmitter, frequency, false);
156 }
157
158 m_OutTransmission.m_bIsActive = true;
159 m_OutTransmission.m_fActiveTimeout = 0;
160 }
161
162 protected Widget GetWidget()
163 {
164 Widget widget;
165 int iWidgetIdx = 0;
166
167 while (iWidgetIdx < m_iTransmissionSlots)
168 {
169 widget = m_aWidgetsIncomingVON.Get(iWidgetIdx);
170 if (!widget.IsVisible())
171 return widget;
172
173 iWidgetIdx++;
174 }
175
176 return null;
177 }
178
179 //------------------------------------------------------------------------------------------------
181 event void OnReceive(int playerId, bool isSenderEditor, BaseTransceiver receiver, int frequency, float quality)
182 {
183 if (!m_wRoot || m_bIsVONUIDisabled) // ignore receiving transmissions if VON UI is off
184 return;
185
186 // Check if there is an active transmission from given player
187 TransmissionData pTransmission = m_aTransmissionMap.Get(playerId);
188
189 // Active transmission from the player not found, create it
190 if (!pTransmission)
191 {
192 if (!receiver && m_bIsVONDirectDisabled) // direct UI off
193 return;
194
195 // No free widget
196 if (!GetWidget())
197 {
198 //Insert new widget to display other transmissions as number
199 pTransmission = new TransmissionData(m_wAdditionalSpeakersWidget, playerId);
200 m_aAdditionalSpeakers.Insert(pTransmission);
201 m_wAdditionalSpeakersText.SetText("+" + m_aAdditionalSpeakers.Count().ToString());
202 m_wAdditionalSpeakersWidget.SetVisible(true);
203 m_wAdditionalSpeakersWidget.SetOpacity(1);
204 pTransmission.m_bIsAdditional = true;
205 pTransmission.m_bVisible = true;
206 }
207 else
208 {
209 pTransmission = new TransmissionData(GetWidget(), playerId);
210 pTransmission.m_bIsAdditional = false;
211 }
212
213 pTransmission.m_fQuality = quality;
214
215 m_aTransmissions.Insert(pTransmission);
216 m_aTransmissionMap.Insert(playerId, pTransmission);
217 }
218
219 // update only when first activation / device changed / frequency changed
220 if (pTransmission.m_bIsActive == false
221 || pTransmission.m_RadioTransceiver != receiver
222 || (receiver && pTransmission.m_fFrequency != frequency)
223 )
224 {
225 pTransmission.m_bIsSenderEditor = isSenderEditor;
226 bool filtered = UpdateTransmission(pTransmission, receiver, frequency, true);
227 if (!filtered)
228 {
229 pTransmission.HideTransmission();
230 return;
231 }
232 SCR_LogitechLEDManager.ActivateState(ELogitechLEDState.COMMS);
233 }
234
235 pTransmission.m_bIsActive = true;
236 pTransmission.m_fActiveTimeout = 0;
237 }
238
239 //------------------------------------------------------------------------------------------------
246 protected bool UpdateTransmission(TransmissionData data, BaseTransceiver radioTransceiver, int frequency, bool IsReceiving)
247 {
248 data.m_RadioTransceiver = radioTransceiver;
249 data.m_bForceUpdate = false;
250
251 if (!radioTransceiver && m_bIsVONDirectDisabled && IsReceiving) // can happen when existing RADIO transmission switches to direct
252 return false;
253
254 // faction
255 Faction playerFaction;
256 int controlledID = GetGame().GetPlayerController().GetPlayerId();
257
258 SCR_FactionManager factionMgr = SCR_FactionManager.Cast(GetGame().GetFactionManager());
259 if (controlledID && factionMgr)
260 {
261 playerFaction = factionMgr.SGetPlayerFaction(controlledID);
262 data.m_Faction = factionMgr.SGetPlayerFaction(data.m_iPlayerID);
263 }
264
265 bool enemyTransmission;
266 if (IsReceiving && playerFaction && playerFaction.IsFactionEnemy(data.m_Faction) && !m_bShowEnemyNames) // enemy transmission case
267 {
268 if (!radioTransceiver)
269 return false; // if direct ignore
270
271 enemyTransmission = true;
272 }
273
274 if (!data.m_wBaseWidget)
275 return false;
276
277 if (data.m_bIsAdditional)
278 return true;
279
280 string sDeviceIcon;
281 data.m_bIsAnimating = true; // start anim
282 data.m_wBaseWidget.SetVisible(true);
283 data.m_Widgets.m_wIcon.SetVisible(true);
284 data.m_Widgets.m_wMicFrame.SetVisible(false);
285 data.m_Widgets.m_wChannelFrame.SetVisible(false);
286 data.m_Widgets.m_wSeparator.SetVisible(false);
287 data.m_Widgets.m_wPlatformImage.SetVisible(false);
288 data.m_Widgets.m_wPlatformImageGlow.SetVisible(false);
289 data.m_Widgets.m_wRecievers.SetVisible(false);
290 data.m_Widgets.m_wNosignal.SetVisible(false);
291
292 // radio
293 if (radioTransceiver)
294 {
295 if (radioTransceiver.IsMuted())
296 {
297 sDeviceIcon = ICON_RADIO_MUTED;
298 }
299 else
300 {
301 sDeviceIcon = ICON_RADIO;
302 }
303
304 float adjustedFreq;
305 data.m_fFrequency = frequency;
306 adjustedFreq = Math.Round(data.m_fFrequency * 0.1) / 100;
307 data.m_Widgets.m_wFrequency.SetText(adjustedFreq.ToString() + " " + LABEL_FREQUENCY_UNITS);
308 data.m_Widgets.m_wFrequency.SetVisible(!data.m_bIsSenderEditor || frequency != 0);
309
310 if (!data.m_bIsSenderEditor && adjustedFreq == 0)
311 Print("SCR_VonDisplay: Incoming frequency 0 | base: " + frequency + " | adjusted: " + adjustedFreq, LogLevel.WARNING);
312 }
313 // direct speech
314 else
315 {
316 data.m_Widgets.m_wFrequency.SetVisible(false);
317 sDeviceIcon = ICON_DIRECT_SPEECH;
318 }
319
320 if (sDeviceIcon != string.Empty)
321 {
322 data.m_Widgets.m_wIcon.LoadImageFromSet(0, m_sImageSet, sDeviceIcon);
323 data.m_Widgets.m_wIconBackground.LoadImageFromSet(0, m_sImageSetGlow, sDeviceIcon);
324 }
325
326 data.m_Widgets.m_wGameMaster.SetVisible(data.m_bIsSenderEditor);
327
328 // incoming
329 if (IsReceiving)
330 {
331 data.m_Widgets.m_wIcon.SetColor(COLOR_WHITE);
332 data.m_Widgets.m_wGameMaster.SetColor(COLOR_WHITE);
333
334 //always show the player name, keep the check if we need it again
335 if (!enemyTransmission || m_bShowEnemyNames)
336 {
337 data.m_Entity = GetGame().GetPlayerManager().GetPlayerControlledEntity(data.m_iPlayerID);
338 SCR_PossessingManagerComponent possMgr = SCR_PossessingManagerComponent.GetInstance();
339 if (data.m_Entity && possMgr && possMgr.IsPossessing(data.m_iPlayerID)) // if possessing, use name of the possessed character instead of player
340 {
341 SCR_CharacterIdentityComponent scrCharIdentity = SCR_CharacterIdentityComponent.Cast(data.m_Entity.FindComponent(SCR_CharacterIdentityComponent));
342 if (scrCharIdentity)
343 {
344 string name;
345 array<string> nameParams = {};
346 scrCharIdentity.GetFormattedFullName(name, nameParams);
347 data.m_Widgets.m_wName.SetTextFormat(name, nameParams[0], nameParams[1], nameParams[2])
348 }
349 else // char might not be using scripted identity component
350 {
351 CharacterIdentityComponent charIdentity = CharacterIdentityComponent.Cast(data.m_Entity.FindComponent(CharacterIdentityComponent));
352 if (charIdentity && charIdentity.GetIdentity())
353 data.m_Widgets.m_wName.SetText(charIdentity.GetIdentity().GetName());
354 else
355 data.m_Widgets.m_wName.SetText(SCR_PlayerNamesFilterCache.GetInstance().GetPlayerDisplayName(data.m_iPlayerID));
356 }
357 }
358 else
359 data.m_Widgets.m_wName.SetText(SCR_PlayerNamesFilterCache.GetInstance().GetPlayerDisplayName(data.m_iPlayerID));
360 }
361 else
362 {
363 data.m_Widgets.m_wName.SetText(LABEL_UNKNOWN_SOURCE);
364 }
365
366 data.m_Widgets.m_wName.SetVisible(true);
367
369 if (playerController)
370 playerController.SetPlatformImageTo(data.m_iPlayerID, data.m_Widgets.m_wPlatformImage, data.m_Widgets.m_wPlatformImageGlow);
371
372 bool sameFaction = playerFaction == data.m_Faction && !data.m_bIsSenderEditor;
373 if (!sameFaction)
374 {
375 data.m_Widgets.m_wRole.SetVisible(false);
376 data.m_Widgets.m_wSquadLeaderIcon.SetVisible(false);
377 return true; // if this isn't a member of your team then you shouldn't see their roles, but you should still see them
378 }
379
380 SCR_GroupsManagerComponent groupsManager = SCR_GroupsManagerComponent.GetInstance();
381 if (!groupsManager)
382 return false; // this will completly hide this VoN entry, but if this is the case, then there are probably more problems at hand
383
384 bool isSquadLeader;
385 SCR_AIGroup playerGroup = groupsManager.GetPlayerGroup(data.m_iPlayerID);
386 if (playerGroup)
387 {
388 data.m_Widgets.m_wRole.SetTextFormat(LABEL_ROLE_FORMAT, playerGroup.GetGroupRoleName());
389
390 SCR_Faction faction = SCR_Faction.Cast(data.m_Faction);
391 isSquadLeader = data.m_iPlayerID == playerGroup.GetLeaderID();
392
393 if (faction && data.m_iPlayerID == faction.GetCommanderId())
394 {
395 data.m_Widgets.m_wRole.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
396 data.m_Widgets.m_wSquadLeaderIcon.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
397 }
398 else
399 {
400 data.m_Widgets.m_wRole.SetColor(COLOR_WHITE);
401 data.m_Widgets.m_wSquadLeaderIcon.SetColor(COLOR_WHITE);
402 }
403 }
404
405 data.m_Widgets.m_wRole.SetVisible(true);
406 data.m_Widgets.m_wSquadLeaderIcon.SetVisible(isSquadLeader);
407 }
408 else // outgoing
409 {
410 data.m_bIsSenderEditor = false;
412 if (editorCore)
413 {
414 SCR_EditorManagerEntity editor = editorCore.GetEditorManager();
415 if (editor)
416 data.m_bIsSenderEditor = editor.IsOpened();
417 }
418
419 data.m_Widgets.m_wName.SetText(string.Empty);
420 data.m_Widgets.m_wName.SetVisible(false);
421 data.m_Widgets.m_wRole.SetText(string.Empty);
422 data.m_Widgets.m_wRole.SetVisible(false);
423 data.m_Widgets.m_wSquadLeaderIcon.SetVisible(false);
424
425 if (radioTransceiver) // direct vs radio
426 {
427 data.m_Widgets.m_wMicFrame.SetVisible(m_bIsChannelToggled);
428
429 if (SCR_Faction.Cast(playerFaction)) // show platoon
430 {
431 int factionHQFrequency = SCR_Faction.Cast(playerFaction).GetFactionRadioFrequency();
432 if (factionHQFrequency == frequency)
433 {
434 data.m_Widgets.m_wChannelText.SetText(LABEL_CHANNEL_PLATOON);
435 data.m_Widgets.m_wChannelFrame.SetVisible(true);
436 }
437 }
438
439 SCR_GroupTaskManagerComponent groupTaskManager = SCR_GroupTaskManagerComponent.GetInstance();
440 if (groupTaskManager && groupTaskManager.IsEnabledAssigningFrequencies() && playerFaction)
441 {
442 SCR_Task task = groupTaskManager.GetTaskByFrequency(playerFaction, frequency);
443 if (task)
444 {
445 data.m_Widgets.m_wChannelText.SetText(groupTaskManager.GetTaskTranslatedName(task));
446 data.m_Widgets.m_wChannelFrame.SetVisible(true);
447 }
448 }
449
450 if (radioTransceiver.IsMuted())
451 {
452 data.m_Widgets.m_wIcon.SetColor(Color.FromInt(GUIColors.RED.PackToInt()));
453 }
454 else
455 {
456 data.m_Widgets.m_wIcon.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
457 }
458
459 data.m_Widgets.m_wGameMaster.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
460
461 PlayerController controller = GetGame().GetPlayerController();
462 data.m_Entity = controller.GetControlledEntity();
463 if (controller)
464 data.m_Faction = factionMgr.SGetPlayerFaction(controller.GetPlayerId());
465
466 if (data.m_Entity && data.m_Faction)
467 {
468 // Refactor note: Reference to specific game mode is not desired
469 SCR_GameModeCampaign gameModeCampaign = SCR_GameModeCampaign.GetInstance();
470 if (gameModeCampaign && !gameModeCampaign.GetBaseManager().IsEntityInFactionRadioSignal(data.m_Entity, data.m_Faction))
471 {
472 data.m_Widgets.m_wRecievers.SetVisible(true);
473 data.m_Widgets.m_wNosignal.SetVisible(true);
474 data.m_Widgets.m_wRecievers.SetColor(Color.FromInt(GUIColors.DARK_GRAY.PackToInt()));
475 data.m_Widgets.m_wNosignal.SetColor(Color.FromInt(GUIColors.DARK_GRAY.PackToInt()));
476 }
477 else
478 {
479 data.m_Widgets.m_wRecievers.SetVisible(false);
480 data.m_Widgets.m_wNosignal.SetVisible(false);
481 }
482 }
483 }
484 else
485 {
486 data.m_Widgets.m_wMicFrame.SetVisible(m_bIsDirectToggled);
487 data.m_Widgets.m_wIcon.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
488 }
489 }
490
491 return true;
492 }
493
494 //------------------------------------------------------------------------------------------------
498 protected void OpacityFade(TransmissionData data, float timeSlice, bool isAdditional = false)
499 {
500 if (!data.m_wBaseWidget)
501 return;
502
503 if (data.m_bIsActive)
504 {
505 data.m_wBaseWidget.SetVisible(true);
506 data.m_bVisible = true;
507
508 data.m_fAlpha = Math.Lerp(data.m_fAlpha, 1, FADEIN_SPEED * timeSlice);
509 if (data.m_fAlpha > 0.99)
510 {
511 data.m_fAlpha = 1;
512 data.m_bIsAnimating = false;
513 }
514 }
515 else
516 {
517 data.m_fAlpha = Math.Lerp(data.m_fAlpha, 0, FADEOUT_SPEED * timeSlice);
518 if (data.m_fAlpha < 0.01)
519 {
520 if (isAdditional)
521 {
522 data.m_fAlpha = 0;
523 data.m_bIsActive = false;
524 data.m_bIsAnimating = false;
525 data.m_fActiveTimeout = 0;
526 data.m_bVisible = false;
527 }
528 else
529 {
530 data.HideTransmission();
531 }
532
533 }
534 }
535
536 if (!isAdditional)
537 data.m_wBaseWidget.SetOpacity(data.m_fAlpha);
538 }
539
540 //------------------------------------------------------------------------------------------------
543 {
544 if (entry.GetVONMethod() == ECommMethod.DIRECT)
545 {
546 m_wSelectedVON.SetText("#AR-VON_DirectTalk");
547 SetHintIcon(false);
548 }
549 else
550 {
551 SCR_VONEntryRadio radioEntry = SCR_VONEntryRadio.Cast(entry);
552 if (!radioEntry || !m_wSelectedHint || !radioEntry.GetUIInfo())
553 return;
554
555 const string formatText = "#AR-VON_ChannelHint";
556 m_wSelectedVON.SetTextFormat(formatText, radioEntry.GetUIInfo().GetName(), radioEntry.GetTransceiverNumber(), radioEntry.GetDisplayText());
557
558 SetHintIcon(true);
559 }
560
561 m_wSelectedText.SetVisible(true);
562
563 m_wSelectedHint.SetOpacity(1);
564 GetGame().GetCallqueue().Remove(FadeSelectedVONHint); // in case of multiple selections
565 GetGame().GetCallqueue().CallLater(FadeSelectedVONHint, SELECTED_HINT_FADE_SPEED); // start fading after a certain display time
566
567 }
568
569 //------------------------------------------------------------------------------------------------
572 void ShowSelectedVONDisabledHint(bool isServerDisabled = false)
573 {
574 if (isServerDisabled)
575 {
578 }
579 else
580 {
581 m_wSelectedHintIcon.LoadImageFromSet(0, m_sImageSet, ICON_RADIO_HINT);
583 }
584
585 m_wSelectedHintIcon.SetColor(Color.FromInt(GUIColors.RED.PackToInt()));
586
587 m_wSelectedVON.SetText("");
588 m_wSelectedText.SetVisible(false);
589
590 m_wSelectedHint.SetOpacity(1);
591 GetGame().GetCallqueue().Remove(FadeSelectedVONHint); // in case of multiple selections
592 GetGame().GetCallqueue().CallLater(FadeSelectedVONHint, SELECTED_HINT_FADE_SPEED); // start fading after a certain display time
593 }
594
595 //------------------------------------------------------------------------------------------------
596 protected void FadeSelectedVONHint()
597 {
599 }
600
601 //------------------------------------------------------------------------------------------------
603 protected void SetHintIcon(bool isRadio)
604 {
605 if (isRadio)
606 {
607 m_wSelectedHintIcon.LoadImageFromSet(0, m_sImageSet, ICON_RADIO_HINT);
609 }
610 else
611 {
614 }
615
616 m_wSelectedHintIcon.SetColor(Color.FromInt(GUIColors.ORANGE.PackToInt()));
617 }
618
619 //------------------------------------------------------------------------------------------------
621 protected void OnVONActiveToggled(bool directState, bool channelState)
622 {
623 m_bIsDirectToggled = directState;
624 m_bIsChannelToggled = channelState;
625
627 {
628 m_OutTransmission.m_bForceUpdate = true;
629 OnCapture(m_OutTransmission.m_RadioTransceiver);
630 }
631 }
632
633 //------------------------------------------------------------------------------------------------
635 protected void OnDestroyed(Instigator killer, IEntity killerEntity)
636 {
638 m_OutTransmission.HideTransmission();
639
640 int count = m_aTransmissions.Count();
641 for (int i = 0; i < count; i++)
642 {
643 m_aTransmissions[i].HideTransmission();
644 }
645 }
646
647 //------------------------------------------------------------------------------------------------
649 protected void InitDisplay()
650 {
651 m_bIsVONUIDisabled = GetGame().IsVONUIDisabledByServer();
652 m_bIsVONDirectDisabled = GetGame().IsVONDirectSpeechUIDisabledByServer();
653
654 m_PlayerController.m_OnDestroyed.Insert(OnDestroyed);
655
656 m_VONController = SCR_VONController.Cast(m_PlayerController.FindComponent(SCR_VONController));
657 m_VONController.GetOnVONActiveToggledInvoker().Insert(OnVONActiveToggled);
658 m_VONController.SetDisplay(this); // we set this from here instead of the other way around to avoid load order issues
659
661
665
671
673 if (!m_SlotHandler)
674 return;
675
676 m_HUDSlotComponent = m_SlotHandler.GetSlotUIComponent();
678 return;
679
680 m_HUDSlotComponent.GetOnResize().Insert(OnSlotUIResize);
681 }
682
683 //------------------------------------------------------------------------------------------------
684 protected void OnSlotUIResize()
685 {
686 // Assign it again in case the SlotUIComponent has changed
687 m_HUDSlotComponent = m_SlotHandler.GetSlotUIComponent();
689 return;
690
691 int height = m_HUDSlotComponent.GetHeight();
692 m_iTransmissionSlots = ((int)height / HEIGHT_DIVIDER) - 1;
693 if (m_iTransmissionSlots <= 0)
695
697 }
698
699 //------------------------------------------------------------------------------------------------
700 protected void UpdateWidgets()
701 {
702 int count = m_aWidgetsIncomingVON.Count();
703
704 if (count == m_iTransmissionSlots)
705 return;
706
707 if (count > m_iTransmissionSlots)
708 {
709 for (int i = count - 1; i > m_iTransmissionSlots; i--)
710 {
711 Widget w = m_aWidgetsIncomingVON.Get(i);
712 if (w)
713 {
714 w.RemoveFromHierarchy();
715 m_aWidgetsIncomingVON.RemoveItem(w);
716 }
717 }
718 }
719 else
720 {
721 for (int i = count; i < m_iTransmissionSlots; i++)
722 {
723 Widget w = GetGame().GetWorkspace().CreateWidgets(m_sReceivingTransmissionLayout, m_wVerticalLayout);
724 if (w)
725 {
726 w.SetVisible(false);
727 m_aWidgetsIncomingVON.Insert(w);
728 }
729 }
730 }
731 }
732
733 //------------------------------------------------------------------------------------------------
734 // Overrides
735 //------------------------------------------------------------------------------------------------
736 override void DisplayUpdate(IEntity owner, float timeSlice)
737 {
738 //Check if the SlotUIComponent is still valid otherwise change to the new one
739 if (m_HUDSlotComponent != m_SlotHandler.GetSlotUIComponent())
740 {
742 m_HUDSlotComponent.GetOnResize().Remove(OnSlotUIResize);
743
744 m_HUDSlotComponent = m_SlotHandler.GetSlotUIComponent();
746 return;
747
748 m_HUDSlotComponent.GetOnResize().Insert(OnSlotUIResize);
749 }
750
751 // update visibility timer
752 if (m_OutTransmission.m_bIsActive)
753 {
754 m_OutTransmission.m_fActiveTimeout += timeSlice;
755
756 if (m_OutTransmission.m_fActiveTimeout > FADEOUT_TIMER_THRESHOLD)
757 {
758 m_OutTransmission.m_bIsActive = false;
759 m_OutTransmission.m_bIsAnimating = true;
760 }
761 }
762
763 // update fade
764 if (m_OutTransmission.m_bIsAnimating)
765 OpacityFade(m_OutTransmission, timeSlice);
766
767 // update incoming transmissions
768 if (m_aTransmissions.IsEmpty())
769 {
770 return;
771 }
772
773 TransmissionData pTransmission;
774 int count = m_aTransmissions.Count() - 1;
775
776 for (int i = count; i >= 0; i--)
777 {
778 if (i > m_aTransmissions.Count() - 1)
779 {
780 count -1;
781 continue;
782 }
783
784 pTransmission = m_aTransmissions[i];
785
786 bool isAdditional = m_aAdditionalSpeakers.Contains(pTransmission);
787
788 // update visibility timer
789 if (pTransmission.m_bIsActive)
790 {
791 pTransmission.m_fActiveTimeout += timeSlice;
792
793 if (pTransmission.m_fActiveTimeout > FADEOUT_TIMER_THRESHOLD)
794 {
795 pTransmission.m_bIsActive = false;
796 pTransmission.m_bIsAnimating = true;
797 }
798 }
799
800 // update fade
801 if (pTransmission.m_bIsAnimating)
802 OpacityFade(pTransmission, timeSlice, isAdditional);
803
804 // remove faded transmissions
805 if (!pTransmission.m_bVisible)
806 {
807 if (pTransmission.m_iPlayerID)
808 m_aTransmissionMap.Remove(pTransmission.m_iPlayerID);
809
810 m_aTransmissions.Remove(i);
811
812 if (isAdditional)
813 {
814 m_aAdditionalSpeakers.Remove(m_aAdditionalSpeakers.Find(pTransmission));
815 m_wAdditionalSpeakersText.SetText("+" + m_aAdditionalSpeakers.Count().ToString());
816
817 if (m_aAdditionalSpeakers.IsEmpty())
818 m_wAdditionalSpeakersWidget.SetVisible(false);
819 }
820
821 if (m_aAdditionalSpeakers.Count() > 0 && (m_aTransmissions.Count() - m_aAdditionalSpeakers.Count()) < m_aWidgetsIncomingVON.Count())
822 {
823 m_aAdditionalSpeakers[0].m_bIsActive = false;
826
828
829 m_aAdditionalSpeakers.Remove(0);
830 m_wAdditionalSpeakersText.SetText("+" + m_aAdditionalSpeakers.Count().ToString());
831
832 if (m_aAdditionalSpeakers.Count() == 0)
833 m_wAdditionalSpeakersWidget.SetVisible(false);
834 }
835
836 count - 1;
837 }
838 }
839 }
840
841 //------------------------------------------------------------------------------------------------
842 override bool DisplayStartDrawInit(IEntity owner)
843 {
844 m_PlayerManager = GetGame().GetPlayerManager();
845
846 return m_PlayerManager != null;
847 }
848
849 //------------------------------------------------------------------------------------------------
850 override void DisplayStartDraw(IEntity owner)
851 {
852 if (!m_wRoot)
853 return;
854
855 InitDisplay();
856 }
857
858 //------------------------------------------------------------------------------------------------
860 {
862 m_OutTransmission.HideTransmission();
863
864 int count = m_aTransmissions.Count();
865 for (int i = 0; i < count; i++)
866 {
867 m_aTransmissions[i].HideTransmission();
868 }
869 }
870
871 //------------------------------------------------------------------------------------------------
872 override void DisplayStopDraw(IEntity owner)
873 {
875 m_PlayerController.m_OnDestroyed.Remove(OnDestroyed);
876
877 if (m_VONController)
878 m_VONController.GetOnVONActiveToggledInvoker().Remove(OnVONActiveToggled);
879 }
880}
ECommMethod
Definition ECommMethod.c:8
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum EAITargetInfoCategory m_Entity
Faction m_Faction
override event void DisplayStartDraw(IEntity owner)
void OnSlotUIResize()
SCR_HUDSlotUIComponent m_HUDSlotComponent
override event void DisplayUpdate(IEntity owner, float timeSlice)
bool m_bForceUpdate
If user changed keybing then it should force update of hints.
override event void DisplayStopDraw(IEntity owner)
void OnDestroyed(IEntity owner)
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
Get all prefabs that have the spawner data
void SCR_FactionManager(IEntitySource src, IEntity parent)
SCR_FastTravelComponentClass m_PlayerController
void SCR_GameModeCampaign(IEntitySource src, IEntity parent)
Widget m_wRoot
void SCR_GroupTaskManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
void SCR_GroupsManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_HintSequenceComponentClass m_bIsActive
SCR_InfoDisplayHandler GetHandler(typename handlerType)
bool DisplayStartDrawInit(IEntity owner)
void DisplayControlledEntityChanged(IEntity from, IEntity to)
ResourceName m_sImageSet
ref SCR_HeaderNavigationWidgets m_Widgets
PlayerManager m_PlayerManager
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
func OnVONActiveToggled
Widget m_wBaseWidget
void HideTransmission()
bool m_bIsSenderEditor
Widget m_wVerticalLayout
RichTextWidget m_wAdditionalSpeakersText
const string WIDGET_SELECTED_ICONGLOW
const int HEIGHT_DIVIDER
float m_fQuality
ref map< int, TransmissionData > m_aTransmissionMap
const string WIDGET_OVERFLOW_TEXT
string m_sImageSetGlow
void OpacityFade(TransmissionData data, float timeSlice, bool isAdditional=false)
TextWidget m_wSelectedVON
bool m_bIsAdditional
bool m_bShowEnemyNames
const string WIDGET_SELECTED_ROOT
Widget m_wAdditionalSpeakersWidget
const string LABEL_UNKNOWN_SOURCE
const string ICON_RADIO_HINT
const string LABEL_ROLE_FORMAT
const string LABEL_CHANNEL_PLATOON
BaseTransceiver m_RadioTransceiver
bool m_bIsVONDirectDisabled
const float FADEOUT_TIMER_THRESHOLD
void UpdateWidgets()
const string ICON_DIRECT_SPEECH
const float FADEOUT_SPEED
const string ICON_SERVER_DISABLE_HINT
ref array< Widget > m_aWidgetsIncomingVON
Widget m_wTalkingAmountWidget
bool m_bIsVONUIDisabled
const float FADEIN_SPEED
ImageWidget m_wSelectedHintIcon
void InitDisplay()
Initialize.
const string WIDGET_OVERFLOW
const string ICON_RADIO
bool UpdateTransmission(TransmissionData data, BaseTransceiver radioTransceiver, int frequency, bool IsReceiving)
SCR_InfoDisplaySlotHandler m_SlotHandler
ImageWidget m_wSelectedHintIconGlow
void ShowSelectedVONHint(SCR_VONEntry entry)
Show hint displaying which VON method was selected.
ref array< ref TransmissionData > m_aAdditionalSpeakers
bool m_bIsChannelToggled
float m_fAlpha
bool IsCapturingTransmisionActive()
Whether outgoing transmission is currently active.
int m_iTransmissionSlots
const string WIDGET_SELECTED_VON
string m_sReceivingTransmissionLayout
void TransmissionData(Widget base, int iPlayerID)
TextWidget m_wSelectedText
SCR_VONController m_VONController
void FadeSelectedVONHint()
ref array< ref TransmissionData > m_aTransmissions
const int SELECTED_HINT_FADE_SPEED
const string LABEL_FREQUENCY_UNITS
const string WIDGET_SELECTED_ICON
void SetHintIcon(bool isRadio)
Set VON info hint icon type.
void ShowSelectedVONDisabledHint(bool isServerDisabled=false)
int GetActiveTransmissionsCount()
Count of active incoming transmissions.
const string WIDGET_SELECTED_TEXT
ref TransmissionData m_OutTransmission
bool m_bIsDirectToggled
float m_fActiveTimeout
const string ICON_RADIO_MUTED
const string WIDGET_INCOMING
const string WIDGET_TRANSMIT
float m_fFrequency
Widget GetWidget()
bool m_bIsAnimating
Widget m_wSelectedHint
static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility=false)
Definition Color.c:13
Definition Math.c:13
string GetGroupRoleName()
int GetLeaderID()
Core component to manage SCR_EditorManagerEntity.
SCR_EditorManagerEntity GetEditorManager()
int GetFactionRadioFrequency()
int GetCommanderId()
Voice over network entry data class, used for management of communication methods.
Definition SCR_VONEntry.c:4
ECommMethod GetVONMethod()
VON method type.
VONEntry class for radio entries.
UIInfo GetUIInfo()
int GetTransceiverNumber()
Associated transceiver id - starts with 1.
Data class for transmissions.
Definition int.c:13
Definition Types.c:486
void OnReceive(int playerId, bool isSenderEditor, BaseTransceiver receiver, int frequency, float quality)
VONComponent event.
void OnCapture(BaseTransceiver transmitter)
VONComponent event.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
SCR_FieldOfViewSettings Attribute
SCR_EditorManagerCore m_iPlayerID
proto external PlayerController GetPlayerController()