Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_WeaponInfo_MultiWeaponTurret.c
Go to the documentation of this file.
1class SCR_WeaponInfo_MultiWeaponTurret : SCR_InfoDisplayExtended
2{
3 [Attribute("", UIWidgets.EditBox, "Name of the turret slot from the SlotManagerComponent")]
4 protected string m_sTurretSlot;
5
6 [Attribute("{4789C90C5591CBC7}Configs/VehicleHUD/VehicleWeaponInfo_GroupWeaponFiremodes.conf")]
7 protected ref GroupWeaponFiremode m_FiremodeIconsConfig;
8
9 //List of Icons mapped to types
10 [Attribute("{8D3E102893955B15}Configs/Inventory/ItemHints/MagazineAmmoType.conf")]
12
13 [Attribute("{09468E8C42D80502}UI/layouts/HUD/WeaponInfo/WeaponInfo_AmmoTypeIcon.layout")]
15
16 [Attribute("1")]
17 protected bool m_bIsPilotOnly;
18
19 [Attribute("0")]
20 protected bool m_bShouldFade;
21
22 [Attribute(uiwidget: UIWidgets.ComboBox, desc: "List of modes for which quantity indicator should be visible.", enumType: EWeaponGroupFireMode)]
23 ref array<EWeaponGroupFireMode> m_aShowQuantityIndicator;
24
25 protected EventHandlerManagerComponent m_turretEventHandler;
26 protected BaseWeaponManagerComponent m_WeaponManager;
27
29
30 //Animations
33
34 protected bool m_bFadeInOutActive;
35
36 protected ref SCR_MultiWeaponTurretDataHolder m_DataHolder;
37 protected EWeaponFeature m_eWeaponStateEvent = EWeaponFeature.NONE;
38
39 //Height in pixels
40 protected const int SIZE_FIREMODE = 50;
41 protected const int SIZE_MAGAZINES = 50;
42
43 //Resources
44 protected const ResourceName DEFAULT_MAGAZINE_LAYOUT = "{8A98061335A620E1}UI/layouts/HUD/WeaponInfo/SingleMagazineWidget_RocketPod.layout";
45 protected const ResourceName DEFAULT_EMPTY_PYLON_LAYOUT = "{5C5829628BBDB274}UI/layouts/HUD/WeaponInfo/WeaponInfo_EmptyPylon.layout";
46
47 //Standard colors for flashes
48 protected const ref Color COLOR_WHITE = Color.FromSRGBA(255, 255, 255, 255);
49 protected const ref Color COLOR_ORANGE = Color.FromSRGBA(226, 167, 79, 255);
50
51 //The localization strings are not the correct ones, because of localization lock at the time of completion
52 protected const string EMPTY_TEXT_LOCALIZED = "#AR-WeaponUI_Empty";
53 protected const string MIXED_TEXT_LOCALIZED = "#AR-WeaponUI_Mixed";
54
55 //Time until whole panel fades out
56 protected const float FADEOUT_PANEL_DELAY = 6;
57 //Time until zeroing fades out
58 protected const float FADEOUT_OPTICS_DELAY = 6;
59
60 private static ref array<EAmmoType> s_AmmoTypes = new array<EAmmoType>();
61 private static ref array<IEntity> s_LoadedRockets = new array<IEntity>();
62
63 void SCR_WeaponInfo_MultiWeaponTurret()
64 {
65 if (s_AmmoTypes.Count() == 0)
66 SCR_Enum.GetEnumValues(EAmmoType, s_AmmoTypes);
67 }
68
69 //######## CALLBACKS ########
70 //------------------------------------------------------------------------------------------------
71 protected void OnTurretChanged(TurretComponent newTurret)
72 {
73 // Set weapon state change flag
74 m_eWeaponStateEvent |= EWeaponFeature.WEAPON;
75
76 Show(newTurret != null);
77 if(!newTurret)
78 return;
79
80 IEntity turretEntity = newTurret.GetOwner();
81
82 //reset widget state
83 if (!m_DataHolder)
84 {
85 m_DataHolder = new SCR_MultiWeaponTurretDataHolder();
86 m_DataHolder.Init();
87 }
88 else
89 {
90 m_DataHolder.Reset();
91 if (m_DataHolder.m_FireModeManager)
92 m_DataHolder.m_FireModeManager.GetOnTurretFireModeValuesChanged().Remove(UpdateQuantityIndicator);
93 }
94
95 //Get turret and turret Controller
96 m_DataHolder.m_Turret = newTurret;
98 if (!m_DataHolder.m_Turret || !m_DataHolder.m_TurretController)
99 return;
100
101 //Get the MultiFire Manager, which contains weapons list, weapons groups and more info we need. Also store the weapons list.
102 m_DataHolder.m_multiWComp = MultiFireWeaponManagerComponent.Cast(turretEntity.FindComponent(MultiFireWeaponManagerComponent));
103 if (!m_DataHolder.m_multiWComp)
104 return;
105
106 m_DataHolder.m_FireModeManager = SCR_FireModeManagerComponent.Cast(turretEntity.FindComponent(SCR_FireModeManagerComponent));
107 if (!m_DataHolder.m_FireModeManager)
108 return;
109
110 m_DataHolder.m_FireModeManager.GetOnTurretFireModeValuesChanged().Insert(UpdateQuantityIndicator);
111 //Get all slots and filter out the empty ones
112 m_DataHolder.m_multiWComp.GetWeaponsSlots(m_DataHolder.m_aWeaponslots);
113
115
116 //fill up everything else
121
122 // Check if weapon has scope sights component
123 m_DataHolder.m_Sights = SCR_2DSightsComponent.Cast(m_DataHolder.m_Turret.GetSights());//GetSights();
124 m_DataHolder.m_SightsZoomFOVInfo = null;
125
126 if (m_DataHolder.m_Sights)
127 m_DataHolder.m_SightsZoomFOVInfo = SCR_SightsZoomFOVInfo.Cast(m_DataHolder.m_Sights.GetFOVInfo());
128
129 if (m_DataHolder.m_SightsZoomFOVInfo)
130 m_DataHolder.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Insert(OnZoomChanged);
131 }
132
133 //------------------------------------------------------------------------------------------------
134 protected void OnFiremodeChangedInit()
135 {
136 string sFiremode;
137 m_DataHolder.m_FireModeManager.GetFireMode(sFiremode);
138 EWeaponGroupFireMode firemode = typename.StringToEnum(EWeaponGroupFireMode, sFiremode);
139
140 OnFiremodeChanged(firemode);
141 UpdateQuantityIndicator(firemode, m_DataHolder.m_FireModeManager.GetRippleQuantity());
142 }
143
144 //------------------------------------------------------------------------------------------------
145 protected void OnFiremodeChanged(EWeaponGroupFireMode newFiremode)
146 {
147 m_eWeaponStateEvent |= EWeaponFeature.FIREMODE;
148
149 UpdateFireModeIndicator(newFiremode);
150
153 }
154
155 //------------------------------------------------------------------------------------------------
156 protected void OnSelectedFiregroupChange(bool hasAmmo)
157 {
158 m_eWeaponStateEvent |= EWeaponFeature.FIREMODE;
159
160 array<int> weaponIds = {};
161 m_DataHolder.m_FireModeManager.GetCurrentWeaponIndices(weaponIds);
162
164 {
165 if (weaponIds.Contains(key.GetWeaponSlotIndex()))
166 slot.SetSelected(true);
167 else
168 slot.SetSelected(false);
169 }
170
171 //OnFiremodeChangedInit();
175 }
176
177 //------------------------------------------------------------------------------------------------
178 protected void OnAmmoCountChanged(BaseWeaponComponent changedWeaponComp, BaseMuzzleComponent changedMuzzleComp, BaseMagazineComponent changedMagComp, int newAmmoCount, bool isBarrelChambered)
179 {
180 if (!m_DataHolder)
181 return;
182
183 m_eWeaponStateEvent |= EWeaponFeature.AMMOCOUNT;
184
185 BaseWeaponComponent tempWeaponComp;
186
187 foreach (WeaponSlotComponent slotComp : m_DataHolder.m_aWeaponslots)
188 {
189 IEntity slottedWeapon = slotComp.GetWeaponEntity();
190 if (!slottedWeapon)
191 continue;
192
193 tempWeaponComp = BaseWeaponComponent.Cast(slottedWeapon.FindComponent(BaseWeaponComponent));
194
195 if (tempWeaponComp == changedWeaponComp)
196 {
197 m_DataHolder.m_mWeaponMags[slotComp].UpdateAmmoCount(changedWeaponComp);
198 break;
199 }
200 }
201
206 }
207
208 //------------------------------------------------------------------------------------------------
209 protected void OnNewWeaponAttached(IEntity newWeapon)
210 {
211 foreach (WeaponSlotComponent curSlot : m_DataHolder.m_aWeaponslots)
212 {
213 if (curSlot.GetWeaponEntity() != newWeapon)
214 continue;
215
216 if (m_DataHolder.m_mWeaponMags.Contains(curSlot))
217 m_DataHolder.m_mWeaponMags[curSlot].DestroyMagazine();
218
219 CreateMagazine(curSlot);
220
221 }
222 }
223
224 //------------------------------------------------------------------------------------------------
225 protected void OnNewWeaponDetached(IEntity newWeapon)
226 {
227 foreach (WeaponSlotComponent curSlot : m_DataHolder.m_aWeaponslots)
228 {
229 if (curSlot.GetWeaponEntity())
230 continue;
231
232 if (!m_DataHolder.m_mWeaponMags.Contains(curSlot))
233 continue;
234
235 m_DataHolder.m_mWeaponMags[curSlot].DestroyMagazine();
236 m_DataHolder.m_mWeaponMags.Remove(curSlot);
237
238 CreateEmptyPylon(curSlot);
239 }
240 }
241
242 //------------------------------------------------------------------------------------------------
243 protected void OnTurretReload(BaseWeaponComponent weapon, bool isFinished, TurretControllerComponent turretController)
244 {
245 OnAmmoCountChanged(weapon, null, null, 0, true);
246 }
247
248 //------------------------------------------------------------------------------------------------
249 protected void OnZoomChanged(float zoom, float fov)
250 {
251 if (!m_DataHolder)
252 return;
253
254 // Set weapon state change flag
255 m_eWeaponStateEvent |= EWeaponFeature.ZOOM;
256 m_DataHolder.m_fZoom = zoom;
257
259 }
260
261 //------------------------------------------------------------------------------------------------
262 protected void OnCompartmentEntered(IEntity vehicle, BaseCompartmentManagerComponent manager, IEntity occupant, int managerID, int slotID)
263 {
264 //band-aid to check if player trying to display is actually the pilot
265 IEntity playerEnt = m_PlayerController.GetControlledEntity();
266 BaseCompartmentSlot playerCompSlot;
267 if (occupant != playerEnt)
268 return;
269
270 m_bFadeInOutActive = true;
271
272 if (!m_bIsPilotOnly || IsPilot(vehicle))
274 else
275 m_WeaponInfoPanelAnimator.FadeOutInstantly();
276 }
277
278 //######## UTILITIES ########
279 //------------------------------------------------------------------------------------------------
280 protected void FillMagazines()
281 {
282 foreach (WeaponSlotComponent slotComp : m_DataHolder.m_aWeaponslots)
283 {
284 if (slotComp.GetWeaponEntity())
285 CreateMagazine(slotComp);
286 else
287 CreateEmptyPylon(slotComp);
288 }
289
291 }
292
293 //------------------------------------------------------------------------------------------------
294 protected void CreateEmptyPylon(WeaponSlotComponent slotComp)
295 {
296 Widget magWidget = GetGame().GetWorkspace().CreateWidgets(DEFAULT_EMPTY_PYLON_LAYOUT, m_Widgets.m_wMagazinesHolder);
297
298 SetMagazinePositionalZOrder(slotComp, magWidget);
299
301 if (!magWidgetComp)
302 return;
303
304 bool isSelected;
305
306 array<int> weaponIds = {};
307 m_DataHolder.m_FireModeManager.GetCurrentWeaponIndices(weaponIds);
308 if (weaponIds.Contains(slotComp.GetWeaponSlotIndex()))
309 isSelected = true;
310
311 magWidgetComp.Init(NULL, SIZE_MAGAZINES, null, isSelected);
312 m_DataHolder.m_mWeaponMags[slotComp] = magWidgetComp;
313 }
314
315 //------------------------------------------------------------------------------------------------
316 protected void CreateMagazine(WeaponSlotComponent slotComp)
317 {
318 IEntity weaponEntity = slotComp.GetWeaponEntity();
319 if (!weaponEntity)
320 return;
321
323 if (!weapon)
324 return;
325
326 WeaponUIInfo wInfo = WeaponUIInfo.Cast(slotComp.GetUIInfo());
327
328 //use those resoures to spawn and initialize magazine widget
329 Widget magWidget;
330 if (wInfo)
331 magWidget = GetGame().GetWorkspace().CreateWidgets(wInfo.m_MagIndicator.m_sMagazineLayout, m_Widgets.m_wMagazinesHolder);
332 else
333 magWidget = GetGame().GetWorkspace().CreateWidgets(DEFAULT_MAGAZINE_LAYOUT, m_Widgets.m_wMagazinesHolder);
334
335 //display on correct side of the UI
336 SetMagazinePositionalZOrder(slotComp, magWidget);
337
339 if (!magWidgetComp)
340 return;
341
342 bool isSelected;
343 array<int> weaponIds = {};
344 m_DataHolder.m_FireModeManager.GetCurrentWeaponIndices(weaponIds);
345 if (weaponIds.Contains(slotComp.GetWeaponSlotIndex()))
346 isSelected = true;
347
348 magWidgetComp.Init(weapon, SIZE_MAGAZINES, wInfo.m_MagIndicator, isSelected);
349 m_DataHolder.m_mWeaponMags[slotComp] = magWidgetComp;
350 }
351
352 //------------------------------------------------------------------------------------------------
353 protected void SetMagazinePositionalZOrder(WeaponSlotComponent slotComp, Widget magWidget)
354 {
355 if (slotComp.GetWeaponSlotIndex() <= m_DataHolder.m_aWeaponslots.Count() / 2)
356 magWidget.SetZOrder(slotComp.GetWeaponSlotIndex() - (m_DataHolder.m_aWeaponslots.Count() / 2));
357 else
358 magWidget.SetZOrder(slotComp.GetWeaponSlotIndex() - (m_DataHolder.m_aWeaponslots.Count() / 2) +1);
359
360 }
361
362 //------------------------------------------------------------------------------------------------
363 protected void FillAmmoTypes()
364 {
365 EAmmoType equippedTypes = 0;
366
367 foreach (WeaponSlotComponent weaponSlotComp : m_DataHolder.m_aWeaponslots)
368 {
369 if (weaponSlotComp.IsChamberingPossible())
370 equippedTypes |= GetAllRocketAmmoTypes(weaponSlotComp);
371 else
372 equippedTypes |= GetGenericAmmoTypes(weaponSlotComp);
373 }
374
375 Widget ammoIcon;
376 SCR_AmmoTypeIcon ammoIconComp;
377 WorkspaceWidget workspace = GetGame().GetWorkspace();
378
379 foreach (EAmmoType type : s_AmmoTypes)
380 {
381 ammoIcon = workspace.CreateWidgets(m_sAmmoTypeIconLayout, m_Widgets.m_wAmmoType);
382 ammoIconComp = SCR_AmmoTypeIcon.Cast(ammoIcon.FindHandler(SCR_AmmoTypeIcon));
383
384 ammoIconComp.Init(type, m_AmmoTypeIcons);
385 m_DataHolder.m_mAmmoTypeWidgets[type] = ammoIconComp;
386
387 m_DataHolder.m_mAmmoTypeWidgets[type].SetVisibility(type & equippedTypes);
388 }
389
392 }
393
394 //------------------------------------------------------------------------------------------------
395 protected void UpdateAmmoTypes()
396 {
397 EAmmoType equippedTypes = 0;
398
399 foreach (WeaponSlotComponent weaponSlotComp : m_DataHolder.m_aWeaponslots)
400 {
401 if (weaponSlotComp.IsChamberingPossible())
402 equippedTypes |= GetAllRocketAmmoTypes(weaponSlotComp);
403 else
404 equippedTypes |= GetGenericAmmoTypes(weaponSlotComp);
405 }
406
407 foreach (EAmmoType type : s_AmmoTypes)
408 {
409 m_DataHolder.m_mAmmoTypeWidgets[type].SetVisibility(type & equippedTypes);
410 }
411 }
412
413 //------------------------------------------------------------------------------------------------
415 {
416 RocketEjectorMuzzleComponent muz = RocketEjectorMuzzleComponent.Cast(weaponSlotComp.GetCurrentMuzzle());
417 if (!muz)
418 return 0;
419
420 EAmmoType ammo = 0;
421 MagazineComponent magComp;
422 MagazineUIInfo magInfo;
423
424 muz.GetLoadedEntities(s_LoadedRockets);
425 foreach (IEntity rocket : s_LoadedRockets)
426 {
427 if (!rocket)
428 continue;
429
430 magComp = MagazineComponent.Cast(rocket.FindComponent(MagazineComponent));
431 if (!magComp)
432 continue;
433
434 magInfo = MagazineUIInfo.Cast(magComp.GetUIInfo());
435
436 ammo |= magInfo.GetAmmoTypeFlags();
437 }
438
439 return ammo;
440 }
441
442 //------------------------------------------------------------------------------------------------
444 {
445 RocketEjectorMuzzleComponent muz = RocketEjectorMuzzleComponent.Cast(weaponSlotComp.GetCurrentMuzzle());
446 if (!muz)
447 return 0;
448
449 IEntity rocket = muz.GetBarrelProjectile(muz.GetCurrentBarrelIndex());
450 if (!rocket)
451 return 0;
452
454 if (!magComp)
455 return 0;
456
457 MagazineUIInfo magInfo = MagazineUIInfo.Cast(magComp.GetUIInfo());
458 return magInfo.GetAmmoTypeFlags();
459 }
460
461 //------------------------------------------------------------------------------------------------
463 {
464 RocketEjectorMuzzleComponent muz = RocketEjectorMuzzleComponent.Cast(weaponSlotComp.GetCurrentMuzzle());
465 if (!muz)
466 return 0;
467
468 BaseMagazineComponent magazine = muz.GetMagazine();
469 if (!magazine)
470 return 0;
471
472 return MagazineUIInfo.Cast(magazine.GetUIInfo()).GetAmmoTypeFlags();
473 }
474
475 //------------------------------------------------------------------------------------------------
477 {
478 foreach (EAmmoType key, SCR_AmmoTypeIcon widget : m_DataHolder.m_mAmmoTypeWidgets)
479 {
480 if (m_DataHolder.m_eAmmoTypeFlags & key)
481 widget.SetNewState(SCR_EWeaponInfoIconState.HIGHLIGHTED);
482 else
483 widget.SetNewState(SCR_EWeaponInfoIconState.DISABLED);
484 }
485 }
486
487 //------------------------------------------------------------------------------------------------
488 protected void SetCurrentAmmoType()
489 {
490 m_DataHolder.m_eAmmoTypeFlags = 0;
491
492 SCR_RocketEjectorMuzzleComponent muz;
493 SCR_WeaponGroup currentGroup;
494
495 foreach (WeaponSlotComponent slot : m_DataHolder.m_aWeaponslots)
496 {
497 array<int> weaponIds = {};
498 m_DataHolder.m_FireModeManager.GetCurrentWeaponIndices(weaponIds);
499
500 if (weaponIds.Contains(slot.GetWeaponSlotIndex()))
501 {
502 muz = SCR_RocketEjectorMuzzleComponent.Cast(slot.GetCurrentMuzzle());
503 if (!muz)
504 continue;
505
506 if (slot.IsChamberingPossible())
507 m_DataHolder.m_eAmmoTypeFlags |= GetCurrentRocketAmmoType(slot);
508 else
509 m_DataHolder.m_eAmmoTypeFlags |= GetGenericAmmoTypes(slot);
510 }
511
512 }
513 }
514
515 //------------------------------------------------------------------------------------------------
516 protected void UpdateWeaponNames()
517 {
519 SCR_RocketEjectorMuzzleComponent muzzle;
520 IEntity rocket;
521 UIInfo wInfo;
522 WeaponComponent wComp;
523
524 m_DataHolder.m_sWeaponNames = string.Empty;
525
526 foreach (WeaponSlotComponent slotComp, SCR_SingleMagazineWidgetComponent_Base value : m_DataHolder.m_mWeaponMags)
527 {
528 if (value.GetCurrentState() != SCR_EWeaponInfoIconState.HIGHLIGHTED)
529 continue;
530
531 if (slotComp.IsChamberingPossible())
532 {
533 muzzle = SCR_RocketEjectorMuzzleComponent.Cast(slotComp.GetCurrentMuzzle());
534 if (!muzzle)
535 continue;
536
537 rocket = muzzle.GetBarrelProjectile(muzzle.GetCurrentBarrelIndex());
538 if (!rocket)
539 continue;
540
542 if (!invComp)
543 continue;
544
545 wInfo = invComp.GetUIInfo();
546 }
547 else
548 {
549 IEntity weaponEntity = slotComp.GetWeaponEntity();
550 if (!weaponEntity)
551 continue;
552
553 wComp = WeaponComponent.Cast(weaponEntity.FindComponent(WeaponComponent));
554 if (!wComp)
555 continue;
556
557 wInfo = wComp.GetUIInfo();
558 }
559
560 string name = wInfo.GetName();
561
562 if (m_DataHolder.m_sWeaponNames.IsEmpty())
563 m_DataHolder.m_sWeaponNames = wInfo.GetName();
564
565 else if (m_DataHolder.m_sWeaponNames != wInfo.GetName())
566 m_DataHolder.m_sWeaponNames = MIXED_TEXT_LOCALIZED;
567 }
568
569 if (m_DataHolder.m_sWeaponNames.IsEmpty())
570 m_DataHolder.m_sWeaponNames = EMPTY_TEXT_LOCALIZED;
571
572 m_Widgets.m_wWeaponName.SetTextFormat(m_DataHolder.m_sWeaponNames);
573 }
574
575 //------------------------------------------------------------------------------------------------
577 {
578 if (!m_DataHolder || !m_Widgets)
579 return;
580
581 m_Widgets.m_wFiremodeIcon.SetVisible(false);
582 m_Widgets.m_wFiremodeGlow.SetVisible(false);
583
584 m_FiremodeIconsConfig.SetIconAndGlowTo(newFiremode, m_Widgets.m_wFiremodeIcon, m_Widgets.m_wFiremodeGlow);
585
586 //resize widgets
587 int sx, sy;
588 m_Widgets.m_wFiremodeIcon.GetImageSize(0, sx, sy);
589
590 float ratio;
591 if (sy != 0)
592 ratio = sx / sy;
593
594 m_Widgets.m_wFiremodeIcon.SetSize(SIZE_FIREMODE * ratio, SIZE_FIREMODE);
595 m_Widgets.m_wFiremodeGlow.SetSize(SIZE_FIREMODE * ratio, SIZE_FIREMODE);
596
597 m_Widgets.m_wFiremodeIcon.SetVisible(true);
598 m_Widgets.m_wFiremodeGlow.SetVisible(true);
599
600 AnimateWidget_ColorFlash(m_Widgets.m_wFiremodeIcon, EWeaponFeature.FIREMODE);
601 }
602
603 //------------------------------------------------------------------------------------------------
608 protected void UpdateQuantityIndicator(EWeaponGroupFireMode fireMode, int quantity, int weaponGroupId = 0)
609 {
610 if (!m_Widgets || !m_Widgets.m_wProjectileQuantityText)
611 return;
612
613 bool show;
614 foreach (int enabledMode : m_aShowQuantityIndicator)
615 {
616 if (enabledMode != fireMode)
617 continue;
618
619 show = true;
620 break;
621 }
622
623 m_Widgets.m_wProjectileQuantityText.SetVisible(show);
624 if (show)
625 m_Widgets.m_wProjectileQuantityText.SetText(quantity.ToString());
626 }
627
628 //------------------------------------------------------------------------------------------------
629 protected void UpdateZoomIndicator()
630 {
631 if (!m_DataHolder || !m_Widgets)
632 return;
633
634 float zoom = m_DataHolder.m_fZoom;
635
636 if (zoom <= 0 || !m_DataHolder.m_bInADS)
637 {
638 m_Widgets.m_wOptics.SetVisible(false);
639 m_Widgets.m_wOpticsText.SetText(string.Empty);
640 }
641 else
642 {
643 string sZoom = zoom.ToString(-1,1);
644 sZoom = string.Format("%1 ×", sZoom);
645
646 m_Widgets.m_wOptics.SetVisible(true);
647 m_Widgets.m_wOpticsText.SetText(sZoom);
648
649 AnimateWidget_ColorFlash(m_Widgets.m_wOptics, EWeaponFeature.ZOOM);
650 }
651 }
652
653 //------------------------------------------------------------------------------------------------
654 protected bool IsPilot(IEntity ownerVehicle)
655 {
656 //band-aid to check if player trying to display is actually the pilot
658 return false;
659
660 IEntity playerEnt = m_PlayerController.GetControlledEntity();
661
662 BaseCompartmentSlot playerCompSlot;
663
665 if (!compManager)
666 return false;
667
668 array <BaseCompartmentSlot> compartments = {};
669 compManager.GetCompartments(compartments);
670 if (compartments.IsEmpty())
671 return false;
672
673 return compartments[0].GetOccupant() == playerEnt;
674 }
675
676 //######## INITIALIZATION ########
677 //------------------------------------------------------------------------------------------------
678 protected void AddEventHandlers(IEntity owner)
679 {
680 //Find the slot that contains our Turret
681 SlotManagerComponent slotManager = SlotManagerComponent.Cast(owner.FindComponent(SlotManagerComponent));
682 EntitySlotInfo turSlot = slotManager.GetSlotByName(m_sTurretSlot);
683 if (!turSlot)
684 return;
685
686 TurretComponent initialTurret = TurretComponent.Cast(turSlot.GetAttachedEntity().FindComponent(TurretComponent));
687 //TurretComponent initialTurret = TurretComponent.Cast(owner.FindComponent(TurretComponent));
688
689 m_turretEventHandler = EventHandlerManagerComponent.Cast(initialTurret.GetOwner().FindComponent(EventHandlerManagerComponent));
691 return;
692
694 {
695 //helicopter specific events
696 m_EventHandlerManager.RegisterScriptHandler("OnCompartmentEntered", this, OnCompartmentEntered);
697
698 //turret specific events
699 m_turretEventHandler.RegisterScriptHandler("OnTurretChange", this, OnTurretChanged);
700 m_turretEventHandler.RegisterScriptHandler("OnFiremodeChange", this, OnFiremodeChanged);
701 m_turretEventHandler.RegisterScriptHandler("OnAmmoCountChanged", this, OnAmmoCountChanged);
702 m_turretEventHandler.RegisterScriptHandler("OnTurretReload", this, OnTurretReload);
703 m_turretEventHandler.RegisterScriptHandler("OnFireGroupChange", this, OnSelectedFiregroupChange);
704 }
705 }
706
707 //------------------------------------------------------------------------------------------------
708 protected void AddSlotsEvents()
709 {
710 InventoryStorageSlot storageInfo;
711
712 foreach (WeaponSlotComponent weaponSlot : m_DataHolder.m_aWeaponslots)
713 {
714 if (!weaponSlot)
715 continue;
716 storageInfo = weaponSlot.GetSlotInfo();
717 if (!storageInfo)
718 continue;
719 storageInfo.GetAttachedEntityInvoker().Insert(OnNewWeaponAttached);
720 storageInfo.GetDetachedEntityInvoker().Insert(OnNewWeaponDetached);
721 }
722 }
723
724 //------------------------------------------------------------------------------------------------
725 protected void RemoveSlotEvents()
726 {
727 InventoryStorageSlot storageInfo;
728
729 foreach (WeaponSlotComponent weaponSlot : m_DataHolder.m_aWeaponslots)
730 {
731 if (!weaponSlot)
732 continue;
733 storageInfo = weaponSlot.GetSlotInfo();
734 if (!storageInfo)
735 continue;
736 storageInfo.GetAttachedEntityInvoker().Remove(OnNewWeaponAttached);
737 storageInfo.GetDetachedEntityInvoker().Remove(OnNewWeaponDetached);
738 }
739 }
740
741 //------------------------------------------------------------------------------------------------
742 protected void RemoveEventHandlers(IEntity owner)
743 {
745 {
746 //helicopter specific events
747 m_EventHandlerManager.RemoveScriptHandler("OnCompartmentEntered", this, OnCompartmentEntered);
748 }
749 m_EventHandlerManager = null;
750
752 {
753 //turret specific events
754 m_turretEventHandler.RemoveScriptHandler("OnTurretChange", this, OnTurretChanged);
755 m_turretEventHandler.RemoveScriptHandler("OnFiremodeChange", this, OnFiremodeChanged);
756 m_turretEventHandler.RemoveScriptHandler("OnAmmoCountChanged", this, OnAmmoCountChanged);
757 m_turretEventHandler.RemoveScriptHandler("OnTurretReload", this, OnTurretReload);
758 m_turretEventHandler.RemoveScriptHandler("OnFireGroupChange", this, OnSelectedFiregroupChange);
759 }
761 }
762
763 //------------------------------------------------------------------------------------------------
764 protected override bool DisplayStartDrawInit(IEntity owner)
765 {
766 if (!owner)
767 return false;
768
769 //find and store Weapon Manager and Menu Manager
770 m_WeaponManager = BaseWeaponManagerComponent.Cast(owner.FindComponent(BaseWeaponManagerComponent));
771 if (!m_WeaponManager)
772 return false;
773
774 m_MenuManager = GetGame().GetMenuManager();
775 if (!m_MenuManager)
776 return false;
777
778 m_DataHolder = new SCR_MultiWeaponTurretDataHolder();
779 m_DataHolder.Init();
780
781 AddEventHandlers(owner);
782 return true;
783 }
784
785 //------------------------------------------------------------------------------------------------
786 protected override void DisplayStartDraw(IEntity owner)
787 {
788 if (!m_wRoot)
789 return;
790
792 m_Widgets.Init(m_wRoot);
793
795 m_WeaponInfoPanelAnimator = new SCR_FadeInOutAnimator(m_Widgets.m_wWeaponInfoPanel, UIConstants.FADE_RATE_FAST, UIConstants.FADE_RATE_SLOW, FADEOUT_PANEL_DELAY, true);
796
798 m_ZeroingAnimator = new SCR_FadeInOutAnimator(m_Widgets.m_wZeroing, UIConstants.FADE_RATE_FAST, UIConstants.FADE_RATE_SLOW, FADEOUT_OPTICS_DELAY, true);
799
800 //Hide the UI if it is only for pilot and the player is not the pilot
801 //sadly currently only way I have to manage this, because of how UI is initialized from the helicopter
802 if (m_bIsPilotOnly && !IsPilot(owner))
803 {
804 m_bFadeInOutActive = true;
805 m_WeaponInfoPanelAnimator.FadeOutInstantly();
806 }
807
808 //CURRENT PLACEHOLDER CODE, DISPLAYING ON HELICOPTER INSTEAD OF TURRET
809 //Find the slot that contains our Turret
810 SlotManagerComponent slotManager = SlotManagerComponent.Cast(owner.FindComponent(SlotManagerComponent));
811 EntitySlotInfo turSlot = slotManager.GetSlotByName(m_sTurretSlot);
812 if (!turSlot)
813 return;
814
815 TurretComponent initialTurret = TurretComponent.Cast(turSlot.GetAttachedEntity().FindComponent(TurretComponent));
816 if (!initialTurret)
817 return;
818
819 //Using the info display on the turret instead, will be used instead of the above once gamecode is ready
820 //TurretComponent initialTurret = TurretComponent.Cast(owner.FindComponent(TurretComponent));
821
822 m_Widgets.m_wFiremode.SetVisible(true);
823 OnTurretChanged(initialTurret);
824
825 }
826
827 //------------------------------------------------------------------------------------------------
828 protected override void DisplayStopDraw(IEntity owner)
829 {
830 // Un-register weapon related weapon event handlers
831 RemoveEventHandlers(owner);
833
834 m_DataHolder = null;
835
836 // Destroy the animators
838 m_ZeroingAnimator = null;
839
840 m_wRoot = null;
841 }
842
843 //######## DISPLAY UPDATE & FADINGS ########
844 //------------------------------------------------------------------------------------------------
845 protected override void DisplayUpdate(IEntity owner, float timeSlice)
846 {
847 if (!m_wRoot || !m_DataHolder || !m_Widgets)
848 return;
849
850 if (m_eWeaponStateEvent != EWeaponFeature.NONE && m_bShouldFade)
851 {
852 FadeElements();
853 m_eWeaponStateEvent = EWeaponFeature.NONE;
854 m_bFadeInOutActive = true;
855 }
856
858 return;
859
861 m_ZeroingAnimator.Update(timeSlice);
862
864 m_WeaponInfoPanelAnimator.Update(timeSlice);
865
867 }
868
869 //------------------------------------------------------------------------------------------------
870 protected void FadeElements()
871 {
872 // Get some shared states / conditions for fading
873 bool inADS = m_DataHolder && m_DataHolder.m_bInADS;
874 bool inInspection = m_DataHolder && m_DataHolder.m_bInInspectionMode;
875
876 // Main weapon UI (magazine, magazine count, firemode) fadein
877 bool panelVisibleEvent = m_eWeaponStateEvent != 0;
878 bool panelVisibleOverride = inADS || inInspection;
879 if (panelVisibleEvent || panelVisibleOverride)
880 m_WeaponInfoPanelAnimator.FadeIn(!panelVisibleOverride);
881
882 // Zeroing indicator fadein
883 bool zeroingWidgetHasText = !m_Widgets.m_wZeroingText.GetText().IsEmpty();
884 bool zeroingVisibleEvent = m_eWeaponStateEvent & (EWeaponFeature.ADS | EWeaponFeature.ZEROING | EWeaponFeature.MUZZLE | EWeaponFeature.WEAPON | EWeaponFeature.INSPECTION);
885 bool zeroingVisibleOverride = inADS || inInspection;
886 if (zeroingWidgetHasText && (zeroingVisibleEvent || zeroingVisibleOverride))
887 m_ZeroingAnimator.FadeIn(!zeroingVisibleOverride);
888 }
889
890 //------------------------------------------------------------------------------------------------
891 protected void AnimateWidget_ColorFlash(Widget w, EWeaponFeature requiredFlag = -1, float speed = UIConstants.FADE_RATE_SLOW)
892 {
893 if (!w)
894 return;
895
896 if (requiredFlag != -1 && m_eWeaponStateEvent != requiredFlag)
897 return;
898
899 w.SetColor(COLOR_ORANGE);
901 }
902}
903
904[BaseContainerProps(configRoot: true)]
905class GroupWeaponFiremode
907 [Attribute("")]
908 ResourceName m_sImageset;
910 [Attribute("")]
911 ResourceName m_sImagesetGlow;
912
914 ref array<ref GroupWeaponFiremodeEntry> m_aFiremodes;
915
917 {
918 foreach (GroupWeaponFiremodeEntry modeEntry : m_aFiremodes)
920 if (modeEntry.m_eMode == firemode)
921 {
922 icon.LoadImageFromSet(0, m_sImageset, modeEntry.m_Icon);
923 glow.LoadImageFromSet(0, m_sImagesetGlow, modeEntry.m_IconGlow);
924
925 icon.SetImage(0);
926 glow.SetImage(0);
929 }
931
935 [Attribute("0", UIWidgets.ComboBox, "Firemode", "", enumType: EWeaponGroupFireMode)]
937
940
941 [Attribute("")]
942 string m_Icon;
944 [Attribute("")]
945 string m_IconGlow;
949class WeaponInfoColorSet
951 [Attribute(UIColors.GetColorAttribute(UIColors.IDLE_ACTIVE), UIWidgets.ColorPicker)]
952 ref Color m_IconColor;
954 [Attribute(UIColors.GetColorAttribute(UIColors.BACKGROUND_HOVERED), UIWidgets.ColorPicker)]
955 ref Color m_BackgroundColor;
957 [Attribute(UIColors.GetColorAttribute(UIColors.IDLE_ACTIVE), UIWidgets.ColorPicker)]
958 ref Color m_GlowColor;
960 [Attribute(UIColors.GetColorAttribute(UIColors.CONTRAST_DEFAULT), UIWidgets.ColorPicker)]
961 ref Color m_ContrastColor;
962}
963
970
971class SCR_MultiWeaponTurretDataHolder
972{
973 //cache information containers
976 MultiFireWeaponManagerComponent m_multiWComp;
977 SCR_FireModeManagerComponent m_FireModeManager;
978
980
981 SCR_2DSightsComponent m_Sights;
983
984 ref array<WeaponSlotComponent> m_aWeaponslots = {};
985 ref array<Widget> m_aEmptyPylonWidgets = {};
988
991
992 float m_fZoom;
993
995
996 //------------------------------------------------------------------------------------------------
997 void Init()
998 {
999 m_Turret = null;
1000 m_TurretController = null;
1001 m_aWeaponslots = {};
1004 m_multiWComp = null;
1005 m_FireModeManager = null;
1006 m_bInADS = false;
1007 m_bInInspectionMode = false;
1008 m_fZoom = 0;
1009 m_bInADS = false;
1010 m_Sights = null;
1011 m_SightsZoomFOVInfo = null;
1012 m_sWeaponNames = "";
1013 m_eAmmoTypeFlags = 0;
1014 }
1015
1016 //------------------------------------------------------------------------------------------------
1017 void Reset()
1018 {
1019 m_Turret = null;
1020 m_TurretController = null;
1021 m_aWeaponslots = {};
1022 m_multiWComp = null;
1023 m_FireModeManager = null;
1024 m_bInADS = false;
1025 m_bInInspectionMode = false;
1026 m_fZoom = 0;
1027 m_bInADS = false;
1028 m_Sights = null;
1029 m_SightsZoomFOVInfo = null;
1030 m_sWeaponNames = "";
1031 m_eAmmoTypeFlags = 0;
1032
1033 //remove previous widgets if present (required for when player is switching seats)
1034 if (m_mWeaponMags.Count() > 0)
1035 {
1036 Widget rootw;
1038 {
1039 if (mag)
1040 rootw = mag.GetRootWidget();
1041 if (rootw)
1042 rootw.RemoveFromHierarchy();
1043 }
1044 m_mWeaponMags.Clear();
1045
1046 foreach(EAmmoType key, SCR_AmmoTypeIcon value : m_mAmmoTypeWidgets)
1048 value.DeleteWidgets();
1049 }
1050 m_mAmmoTypeWidgets.Clear();
1051 }
1052 }
1053}
override void Init()
ArmaReforgerScripted GetGame()
Definition game.c:1398
SCR_AIGroupInfoComponentClass IDLE
Group has no waypoints and does not engage an enemy.
void SetIconAndGlowTo(EAmmoType ammoType, notnull ImageWidget icon, notnull ImageWidget glow)
EDamageType type
SCR_FastTravelComponentClass m_PlayerController
Widget m_wRoot
bool m_bInADS
EventHandlerManagerComponent m_EventHandlerManager
MenuManager m_MenuManager
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
EAmmoType
MultiFireWeaponManagerComponent m_multiWComp
enum SCR_EWeaponInfoIconState m_Turret
SCR_FireModeManagerComponent m_FireModeManager
ref map< EAmmoType, SCR_AmmoTypeIcon > m_mAmmoTypeWidgets
ref array< WeaponSlotComponent > m_aWeaponslots
TurretControllerComponent m_TurretController
EAmmoType m_eAmmoTypeFlags
ref array< Widget > m_aEmptyPylonWidgets
class GroupWeaponFiremodeEntry BaseContainerProps()] class WeaponInfoColorSet
SCR_2DSightsComponent m_Sights
ref map< WeaponSlotComponent, SCR_SingleMagazineWidgetComponent_Base > m_mWeaponMags
SCR_SightsZoomFOVInfo m_SightsZoomFOVInfo
EWeaponGroupFireMode m_eMode
static WidgetAnimationColor Color(Widget widget, Color color, float speed)
Definition Color.c:13
Adds ability to attach an object to a slot.
proto external Managed FindComponent(typename typeName)
EAmmoType GetAmmoTypeFlags()
void SetNewState(SCR_EWeaponInfoIconState newState)
void Init(EAmmoType ammoType, SCR_AmmoTypeInfoConfig ammoTypeConfig)
void Init(BaseWeaponComponent weapon, int height, SCR_MagazineIndicatorConfiguration magConfig, bool isSelected)
void OnAmmoCountChanged(BaseWeaponComponent changedWeaponComp, BaseMuzzleComponent changedMuzzleComp, BaseMagazineComponent changedMagComp, int newAmmoCount, bool isBarrelChambered)
void OnCompartmentEntered(IEntity vehicle, BaseCompartmentManagerComponent manager, IEntity occupant, int managerID, int slotID)
ref SCR_MultiWeaponTurretDataHolder m_DataHolder
EAmmoType GetGenericAmmoTypes(WeaponSlotComponent weaponSlotComp)
EAmmoType GetCurrentRocketAmmoType(WeaponSlotComponent weaponSlotComp)
void OnTurretReload(BaseWeaponComponent weapon, bool isFinished, TurretControllerComponent turretController)
void UpdateFireModeIndicator(EWeaponGroupFireMode newFiremode)
void UpdateQuantityIndicator(EWeaponGroupFireMode fireMode, int quantity, int weaponGroupId=0)
ref SCR_WeaponInfo_MultiWeaponTurretWidgets m_Widgets
void OnFiremodeChanged(EWeaponGroupFireMode newFiremode)
EAmmoType GetAllRocketAmmoTypes(WeaponSlotComponent weaponSlotComp)
void CreateMagazine(WeaponSlotComponent slotComp)
void OnTurretChanged(TurretComponent newTurret)
void AnimateWidget_ColorFlash(Widget w, EWeaponFeature requiredFlag=-1, float speed=UIConstants.FADE_RATE_SLOW)
override void DisplayUpdate(IEntity owner, float timeSlice)
void SetMagazinePositionalZOrder(WeaponSlotComponent slotComp, Widget magWidget)
void CreateEmptyPylon(WeaponSlotComponent slotComp)
ref array< EWeaponGroupFireMode > m_aShowQuantityIndicator
UIInfo - allows to define UI elements.
Definition UIInfo.c:14
ref SCR_MagazineIndicatorConfiguration m_MagIndicator
Definition Types.c:486
override void Show()
Definition gameLib.c:262
@ NULL
Unknown type.
Definition DataVarType.c:21
SCR_FieldOfViewSettings Attribute
@ HIGHLIGHTED
Entity requires player's attention.
@ DISABLED
General event switch.
Definition EntityEvent.c:35
void Reset()
EWeaponGroupFireMode