Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_WeaponInfo.c
Go to the documentation of this file.
1//#define WEAPON_INFO_DEBUG
2//#define WEAPON_INFO_DEBUG_STATES
3
4//#define WEAPON_INFO_DEBUG_WATERFALL_EVENTS
5//#define WEAPON_INFO_BLOCK_WATERFALL_EVENTS
6
7// Will enable lots of logging on every event
8// Can define it through -scrDefine WEAPON_INFO_DEBUG
9
11{
12 /*UNDEFINED = 0,*/
13 FMJ = 1 << 0,
14 TRACER = 1 << 1,
15 AP = 1 << 2,
16 HE = 1 << 3,
17 HEAT = 1 << 4,
18 FRAG = 1 << 5,
19 SMOKE = 1 << 6,
20 INCENDIARY = 1 << 7,
21 SNIPER = 1 << 8,
22 ILLUMINATION = 1 << 9,
23 TRAINING = 1 << 10,
24 SUBSONIC = 1 << 11,
25 HEDP = 1 << 12,
26}
27
28enum EWeaponFeature
29{
30 NONE = 0,
35 MUZZLE = 16,
36 WEAPON = 32,
37 ADS = 64,
40 ZOOM = 512,
41 RELOADING = 1024,
42 MISC = 32768
43};
44
45class SCR_WeaponInfo : SCR_InfoDisplayExtended
46{
47 #ifdef WEAPON_INFO_DEBUG
48 static void _print(string str)
49 {
50 int hour, minute, second;
51 System.GetHourMinuteSecondUTC(hour, minute, second);
52 string timeStr = string.Format("%1.%2.%3", hour, minute, second);
53 Print(string.Format("%1 [Weapon Info UI] %2", timeStr, str), LogLevel.DEBUG);
54 }
55 #endif
56
57 const int SIZE_FIREMODE = 50; // Height in pixels
58 const int SIZE_MAGAZINE = 77; // Height in pixels
59
60 const float UPDATE_INTERVAL = 0.1;
61 const float FADED_OPACITY = 0.3;
62
63 static const ref Color COLOR_WHITE = Color.FromSRGBA(255, 255, 255, 255);
64 static const ref Color COLOR_ORANGE = Color.FromSRGBA(226, 167, 79, 255);
65
66 protected const float FADEOUT_PANEL_DELAY = 6; // Time until whole panel fades out
67 protected const float FADEOUT_OPTICS_DELAY = 6; // Time until zeroing fades out
68 protected const float FADEOUT_AMMO_TYPE_DELAY = 6; // Time until ammo type fades out
69
70 protected BaseWeaponManagerComponent m_WeaponManager;
71 protected SCR_InventoryStorageManagerComponent m_InventoryManager;
73
74 // Members for previous states of weapon
76
77 protected EWeaponFeature m_eWeaponStateEvent = EWeaponFeature.NONE;
78
79 // Resources
80 protected const ResourceName DEFAULT_WEAPON_INFO_LAYOUT = "{8170DE93810F928A}UI/layouts/HUD/WeaponInfo/WeaponInfo.layout";
81 protected const ResourceName DEFAULT_MAGAZINE_INDICATOR = "{7C114BA7C59E198D}Configs/WeaponInfo/MagazineIndicators/box.conf";
82
83 // Widgets
85
88
89 protected bool m_bFadeInOutActive = false;
90
91 // Other
92 ref SCR_MagazinePredicate m_pMagazineSearchPredicate = new SCR_MagazinePredicate(); // Predicate for searching for magazines
93 ref SCR_PrefabDataPredicate m_pPrefabDataPredicate = new SCR_PrefabDataPredicate();
94
95 //------------------------------------------------------------------------------------------------
96 protected bool IsCurrentlyUsingWeapon(notnull BaseWeaponComponent weapon)
97 {
98 // Sometimes when events are raised, then they are passing weapon as a slot,
99 // while sometimes it will be with an actual weapon's weapon component,
100 // thus we need to be ready for both cases
101 WeaponSlotComponent weaponSlot = WeaponSlotComponent.Cast(weapon);
102 if (weaponSlot && weaponSlot != m_WeaponManager.GetCurrentSlot())
103 return false;
104
105 if (!weaponSlot && m_WeaponManager.GetCurrentWeapon() != weapon)
106 return false;
107
108 return true;
109 }
110
111 //------------------------------------------------------------------------------------------------
112 protected void OnWeaponChanged(BaseWeaponComponent weapon, BaseWeaponComponent prevWeapon)
113 {
114 #ifdef WEAPON_INFO_DEBUG
115 _print("OnWeaponChanged");
116 _print(string.Format(" weapon: %1", weapon));
117 #endif
118
119 // Set weapon state change flag
120 m_eWeaponStateEvent |= EWeaponFeature.WEAPON;
121
122 // In case of grenades, the provided weapon is a weapon slot, with the actual grenade inside this slot
123 WeaponSlotComponent weaponSlot = WeaponSlotComponent.Cast(weapon);
124
125 if (weaponSlot)
126 {
127 IEntity e = weaponSlot.GetWeaponEntity();
128
129 if (e)
131 else
132 weapon = null;
133 }
134
135 // Initialize weapon state from our current weapon
136 if (!m_WeaponState)
138
139 if (m_WeaponState.m_Weapon != weapon)
140 {
141 // Remove any possible existing "zoom-changed" invokers
142 if (m_WeaponState.m_SightsZoomFOVInfo)
143 m_WeaponState.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Remove(OnZoomChanged);
144
145 // Wipe the weapon state data
146 m_WeaponState.Init();
147 }
148
149 // Store current weapon
150 m_WeaponState.m_Weapon = weapon;
151
152 // Hide weapon UI if there is no weapon equipped and stop
153 Show(weapon != null);
154
155 if (!weapon)
156 return;
157
158 // Get weapon & grenade UI info
159 m_WeaponState.m_WeaponUI = WeaponUIInfo.Cast(weapon.GetUIInfo());
160 m_WeaponState.m_GrenadeUI = GrenadeUIInfo.Cast(m_WeaponState.m_WeaponUI);
161
162 // If weapon is a grenade, get its type
163 if (m_WeaponState.m_GrenadeUI)
164 {
165 m_WeaponState.m_eAmmoTypeFlags = m_WeaponState.m_GrenadeUI.GetAmmoTypeFlags();
166 m_WeaponState.m_bHasSpecialAmmo = !(m_WeaponState.m_eAmmoTypeFlags == 0 || m_WeaponState.m_eAmmoTypeFlags & EAmmoType.FMJ);
167
168 m_WeaponState.m_MagazineConfig = m_WeaponState.m_GrenadeUI.m_MagIndicator;
169 }
170
171 // Check if weapon is a grenade
172 IEntity e = weapon.GetOwner();
173
174 if ((e && e.FindComponent(GrenadeMoveComponent)) || SCR_MineWeaponComponent.Cast(weapon))
175 m_WeaponState.m_bIsExplosive = true;
176 else
177 m_WeaponState.m_bIsExplosive = false;
178
179 // Check if weapon has scope sights component
180 m_WeaponState.m_Sights = GetSights();
181 m_WeaponState.m_SightsZoomFOVInfo = null;
182
183 if (m_WeaponState.m_Sights)
184 m_WeaponState.m_SightsZoomFOVInfo = SCR_SightsZoomFOVInfo.Cast(m_WeaponState.m_Sights.GetFOVInfo());
185
186 if (m_WeaponState.m_SightsZoomFOVInfo)
187 m_WeaponState.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Insert(OnZoomChanged);
188
189 // Auto-trigger child events
190 #ifndef WEAPON_INFO_BLOCK_WATERFALL_EVENTS
191 OnMuzzleChanged_init(weapon);
192 OnADSChanged_init(weapon);
193 #endif
194 }
195
196 //------------------------------------------------------------------------------------------------
198 {
199 BaseMuzzleComponent muzzle;
200
201 if (weapon)
202 muzzle = weapon.GetCurrentMuzzle();
203
204 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
205 Print("OnMuzzleChanged_init");
206 Print(string.Format(" weapon: %1", weapon));
207 Print(string.Format(" muzzle: %1", muzzle));
208 #endif
209
210 OnMuzzleChanged(weapon, muzzle, null);
211 }
212
213 //------------------------------------------------------------------------------------------------
215 {
216 if (!m_WeaponState)
217 return;
218
219 #ifdef WEAPON_INFO_DEBUG
220 _print("OnMuzzleChanged");
221 _print(string.Format(" weapon: %1", weapon));
222 _print(string.Format(" muzzle: %1", muzzle));
223 #endif
224
225 m_eWeaponStateEvent |= EWeaponFeature.MUZZLE;
226
227 m_WeaponState.m_Muzzle = muzzle;
228
229 if (!muzzle)
230 {
231 // GRENADE
232
233 m_WeaponState.m_MuzzleUI = null;
234 m_WeaponState.m_bBarrelChambered = false;
235 m_WeaponState.m_bBarrelCanBeChambered = false;
236 }
237 else
238 {
239 // NON-GRENADE
240
241 m_WeaponState.m_MuzzleUI = MuzzleUIInfo.Cast(muzzle.GetUIInfo());
242 m_WeaponState.m_bBarrelChambered = muzzle.IsBarrelChambered(muzzle.GetCurrentBarrelIndex());
243 m_WeaponState.m_bBarrelCanBeChambered = muzzle.IsChamberingPossible();
244 }
245
246 // Update weapon name & caliber (mostly for vehicle weapons)
248
249 // Auto-trigger child events
250 #ifndef WEAPON_INFO_BLOCK_WATERFALL_EVENTS
251 OnFiremodeChanged_init(weapon, muzzle);
252 OnZeroingChanged_init(weapon);
253 OnMagazineChanged_init(weapon, muzzle);
254 #endif
255 }
256
257 //------------------------------------------------------------------------------------------------
259 {
260 BaseMagazineComponent magazine;
261
262 if (muzzle)
263 magazine = muzzle.GetMagazine();
264
265 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
266 _print("OnMagazineChanged_init");
267 _print(string.Format(" weapon: %1", weapon));
268 _print(string.Format(" muzzle: %1", muzzle));
269 _print(string.Format(" magazine: %1", magazine));
270 #endif
271
272 OnMagazineChanged(weapon, magazine, null);
273 }
274
275 //------------------------------------------------------------------------------------------------
277 {
278 if (!m_WeaponState || !weapon)
279 return;
280
281 #ifdef WEAPON_INFO_DEBUG
282 _print("OnMagazineChanged");
283 _print(string.Format(" weapon: %1", weapon));
284 _print(string.Format(" magazine: %1", magazine));
285 #endif
286
287 if (!IsCurrentlyUsingWeapon(weapon))
288 return;
289
290 // Set weapon state change flag
291 m_eWeaponStateEvent |= EWeaponFeature.MAGAZINE;
292
293 m_WeaponState.m_Magazine = magazine;
294
295 if (magazine)
296 m_WeaponState.m_MagazineUI = MagazineUIInfo.Cast(magazine.GetUIInfo());
297 else
298 m_WeaponState.m_MagazineUI = null;
299
300 if (m_WeaponState.m_MagazineUI)
301 {
302 m_WeaponState.m_eAmmoTypeFlags = m_WeaponState.m_MagazineUI.GetAmmoTypeFlags();
303 m_WeaponState.m_bHasSpecialAmmo = !(m_WeaponState.m_eAmmoTypeFlags == 0 || m_WeaponState.m_eAmmoTypeFlags & EAmmoType.FMJ);
304 }
305
306 // Initialize the magazine icon based on magazineUi > muzzleUi > weaponUi
307 m_WeaponState.m_MagazineConfig = GetMagazineConfig(m_WeaponState);
308
309 #ifndef WEAPON_INFO_BLOCK_WATERFALL_EVENTS
310 OnMagazineCountChanged_init(weapon, magazine);
311 OnAmmoCountChanged_init(weapon, magazine);
312 #endif
313
314 // Update magazine texture setup
317 }
318
319 //------------------------------------------------------------------------------------------------
321 {
322 BaseMuzzleComponent muzzle;
323
324 if (weapon)
325 muzzle = weapon.GetCurrentMuzzle();
326
327 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
328 _print("OnMagazineCountChanged_init");
329 _print(string.Format(" weapon: %1", weapon));
330 _print(string.Format(" muzzle: %1", muzzle));
331 _print(string.Format(" magazine: %1", magazine));
332 #endif
333
334 // Get the character/vehicle inventory manager
336
337 if (!weapon || !invManager)
338 {
339 OnMagazineCountChanged(weapon, 0, false);
340 return;
341 }
342
343 int magazineCount = 0;
344
345 if (muzzle)
346 {
347 // WEAPON WITH MUZZLE -> NON-GRENADE
348
349 // Find compatible magazines for this magazine well
350 BaseMagazineWell magWell = muzzle.GetMagazineWell();
351
352 if (magWell)
353 {
354 m_pMagazineSearchPredicate.magWellType = magWell.Type();
355 array<IEntity> magEntities = new array<IEntity>;
356 invManager.FindItems(magEntities, m_pMagazineSearchPredicate);
357 magazineCount = magEntities.Count();
358 }
359 else
360 {
361 // No magazine well, weapon is probably not reloadable
362 magazineCount = 0;
363 }
364 }
365 else
366 {
367 // WEAPON WITHOUT MUZZLE -> GRENADE
368
369 // Find compatible weapons (same grenades for instance)
370 m_pPrefabDataPredicate.prefabData = weapon.GetOwner().GetPrefabData();
371 array<IEntity> sameWeapons = new array<IEntity>;
372 invManager.FindItems(sameWeapons, m_pPrefabDataPredicate);
373
374 // Remaining 'mags' count text
375 magazineCount = sameWeapons.Count();
376 }
377
378 bool isGrenade = m_WeaponState.m_bIsExplosive;
379
380 OnMagazineCountChanged(weapon, magazineCount, isGrenade);
381 }
382
383 //------------------------------------------------------------------------------------------------
384 protected void OnMagazineCountChanged(BaseWeaponComponent weapon, int magazineCount, bool isGrenade)
385 {
386 if (!m_WeaponState || !weapon)
387 return;
388
389 #ifdef WEAPON_INFO_DEBUG
390 _print("OnMagazineCountChanged");
391 _print(string.Format(" weapon: %1", weapon));
392 _print(string.Format(" magazineCount: %1", magazineCount));
393 _print(string.Format(" isGrenade: %1", isGrenade));
394 #endif
395
396 if (!IsCurrentlyUsingWeapon(weapon))
397 return;
398
399 BaseMagazineComponent magazine = weapon.GetCurrentMagazine();
400 m_WeaponState.m_Magazine = magazine;
401
402 // Set weapon state change flag
403 m_eWeaponStateEvent |= EWeaponFeature.MAGAZINE_COUNT;
404
405 m_WeaponState.m_iMagCount = magazineCount;
406 m_WeaponState.m_bIsExplosive = isGrenade;
407
408 // Update magazine textures for rocket and grenade launchers
409 // Magazine for rocket and grenade launchers gets deleted after firing
410 if (!magazine)
411 {
414 }
415
417 }
418
419 //------------------------------------------------------------------------------------------------
421 {
422 BaseMuzzleComponent muzzle;
423
424 if (weapon)
425 muzzle = weapon.GetCurrentMuzzle();
426
427 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
428 _print("OnAmmoCountChanged_init");
429 _print(string.Format(" weapon: %1", weapon));
430 _print(string.Format(" muzzle: %1", muzzle));
431 _print(string.Format(" magazine: %1", magazine));
432 #endif
433
434 int ammoCount = 0;
435
436 if (magazine)
437 ammoCount = magazine.GetAmmoCount();
438
439 bool isBarrelChambered = false;
440
441 if (muzzle)
442 isBarrelChambered = muzzle.IsCurrentBarrelChambered();
443
444 OnAmmoCountChanged(weapon, muzzle, magazine, ammoCount, isBarrelChambered);
445 }
446
447 //------------------------------------------------------------------------------------------------
448 protected void OnAmmoCountChanged(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle, BaseMagazineComponent magazine, int ammoCount, bool isBarrelChambered)
449 {
450 if (!m_WeaponState || !weapon)
451 return;
452
453 #ifdef WEAPON_INFO_DEBUG
454 _print("OnAmmoCountChanged");
455 _print(string.Format(" weapon: %1", weapon));
456 _print(string.Format(" muzzle: %1", muzzle));
457 _print(string.Format(" magazine: %1", magazine));
458 _print(string.Format(" ammoCount: %1", ammoCount));
459 _print(string.Format(" isBarrelChambered: %1", isBarrelChambered));
460 #endif
461
462 if (!IsCurrentlyUsingWeapon(weapon))
463 return;
464
465 // Set weapon state change flag
466 m_eWeaponStateEvent |= EWeaponFeature.AMMOCOUNT;
467
468 m_WeaponState.m_bBarrelChambered = isBarrelChambered;
469
470 m_WeaponState.m_iMagAmmoCount = ammoCount;
471 m_WeaponState.m_iMagMaxAmmoCount = 1;
472
473 if (magazine)
474 m_WeaponState.m_iMagMaxAmmoCount = magazine.GetMaxAmmoCount();
475
476 if (m_WeaponState.m_iMagMaxAmmoCount == 0)
477 m_WeaponState.m_iMagMaxAmmoCount = 1;
478
479 m_WeaponState.m_fMagAmmoPerc = m_WeaponState.m_iMagAmmoCount / m_WeaponState.m_iMagMaxAmmoCount;
480
481 if (magazine)
483
485
486 if (ammoCount == 0 && weapon)
487 SCR_LogitechLEDManager.ActivateState(ELogitechLEDState.RELOAD);
488 }
489
490 //------------------------------------------------------------------------------------------------
492 {
493 BaseFireMode firemode;
494
495 if (muzzle)
496 firemode = muzzle.GetCurrentFireMode();
497
498 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
499 _print("OnFiremodeChanged_init");
500 _print(string.Format(" weapon: %1", weapon));
501 _print(string.Format(" muzzle: %1", muzzle));
502 _print(string.Format(" firemode: %1", firemode));
503 #endif
504
505 OnFiremodeChanged(weapon, muzzle, firemode);
506 }
507
508 //------------------------------------------------------------------------------------------------
510 {
511 if (!m_WeaponState)
512 return;
513
514 #ifdef WEAPON_INFO_DEBUG
515 _print("OnFiremodeChanged");
516 _print(string.Format(" weapon: %1", weapon));
517 _print(string.Format(" muzzle: %1", muzzle));
518 _print(string.Format(" firemode: %1", firemode));
519 #endif
520
521 // Set weapon state change flag
522 m_eWeaponStateEvent |= EWeaponFeature.FIREMODE;
523
524 if (firemode)
525 m_WeaponState.m_FireModeType = firemode.GetFiremodeType();
526 else
527 m_WeaponState.m_FireModeType = EWeaponFiremodeType.Semiauto;
528
530 }
531
532 //------------------------------------------------------------------------------------------------
534 {
535 int zeroing = 0;
536
537 if (weapon)
538 zeroing = weapon.GetCurrentSightsZeroing();
539
540 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
541 _print("OnZeroingChanged_init");
542 _print(string.Format(" weapon: %1", weapon));
543 _print(string.Format(" zeroing: %1", zeroing));
544 #endif
545
546 OnZeroingChanged(weapon, zeroing);
547 }
548
549 //------------------------------------------------------------------------------------------------
550 protected void OnZeroingChanged(BaseWeaponComponent weapon, int zeroing)
551 {
552 if (!m_WeaponState || !weapon)
553 return;
554
555 #ifdef WEAPON_INFO_DEBUG
556 _print("OnZeroingChanged");
557 _print(string.Format(" weapon: %1", weapon));
558 _print(string.Format(" zeroing: %1", zeroing));
559 #endif
560
561 if (!IsCurrentlyUsingWeapon(weapon))
562 return;
563
564 // Set weapon state change flag
565 m_eWeaponStateEvent |= EWeaponFeature.ZEROING;
566
567 m_WeaponState.m_iZeroing = zeroing;
568
570 }
571
572 //------------------------------------------------------------------------------------------------
574 {
575 bool inADS = false;
576
577 if (weapon)
578 inADS = weapon.IsSightADSActive();
579
580 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
581 _print("OnADSChanged_init");
582 _print(string.Format(" weapon: %1", weapon));
583 _print(string.Format(" inADS: %1", inADS));
584 #endif
585
586 OnADSChanged(weapon, inADS);
587 }
588
589 //------------------------------------------------------------------------------------------------
590 protected void OnADSChanged(BaseWeaponComponent weapon, bool inADS)
591 {
592 if (!m_WeaponState)
593 return;
594
595 #ifdef WEAPON_INFO_DEBUG
596 _print("OnADSChanged");
597 _print(string.Format(" weapon: %1", weapon));
598 _print(string.Format(" inADS: %1", inADS));
599 #endif
600
601 // Set weapon state change flag
602 m_eWeaponStateEvent |= EWeaponFeature.ADS;
603
604 m_WeaponState.m_bInADS = inADS;
605
606 #ifndef WEAPON_INFO_BLOCK_WATERFALL_EVENTS
607 OnZoomChanged_init(weapon);
608 #endif
609 }
610
611 //------------------------------------------------------------------------------------------------
613 {
614 float zoom = 0;
615
616 if (m_WeaponState.m_SightsZoomFOVInfo)
617 zoom = m_WeaponState.m_SightsZoomFOVInfo.GetCurrentZoom();
618
619 #ifdef WEAPON_INFO_DEBUG_WATERFALL_EVENTS
620 _print("OnZoomChanged_init");
621 _print(string.Format(" weapon: %1", weapon));
622 _print(string.Format(" zoom: %1", zoom));
623 #endif
624
625 OnZoomChanged(zoom, -1);
626 }
627
628 //------------------------------------------------------------------------------------------------
629 protected void OnZoomChanged(float zoom, float fov)
630 {
631 if (!m_WeaponState)
632 return;
633
634 #ifdef WEAPON_INFO_DEBUG
635 _print("OnZoomChanged");
636 _print(string.Format(" zoom: %1", zoom));
637 _print(string.Format(" fov: %1", fov));
638 #endif
639
640 // Set weapon state change flag
641 m_eWeaponStateEvent |= EWeaponFeature.ZOOM;
642
643 m_WeaponState.m_fZoom = zoom;
644
646 }
647
648 //------------------------------------------------------------------------------------------------
649 protected void OnInspectionModeChanged(bool state)
650 {
651 if (!m_WeaponState)
652 return;
653
654 #ifdef WEAPON_INFO_DEBUG
655 _print("OnInspectionModeChanged");
656 _print(string.Format(" state: %1", state));
657 #endif
658
659 // Set weapon state change flag
660 m_eWeaponStateEvent |= EWeaponFeature.INSPECTION;
661
662 m_WeaponState.m_bInInspectionMode = state;
663 }
664
665 //------------------------------------------------------------------------------------------------
666 protected void OnAttachmentChanged(WeaponComponent weapon, bool isAttached, IEntity attachmentEntity)
667 {
668 if (!m_WeaponState)
669 return;
670
671 #ifdef WEAPON_INFO_DEBUG
672 _print("OnAttachmentChanged");
673 _print(string.Format(" isAttached: %1", isAttached));
674 _print(string.Format(" attachmentEntity: %1", attachmentEntity));
675 #endif
676
677 SCR_2DSightsComponent sights = GetSights();
678
679 // Sights has changed
680 if (sights != m_WeaponState.m_Sights)
681 {
682 // Remove any possible existing "zoom-changed" invokers
683 if (m_WeaponState.m_SightsZoomFOVInfo)
684 m_WeaponState.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Remove(OnZoomChanged);
685
686 m_WeaponState.m_Sights = sights;
687 m_WeaponState.m_SightsZoomFOVInfo = null;
688
689 if (m_WeaponState.m_Sights)
690 m_WeaponState.m_SightsZoomFOVInfo = SCR_SightsZoomFOVInfo.Cast(m_WeaponState.m_Sights.GetFOVInfo());
691
692 if (m_WeaponState.m_SightsZoomFOVInfo)
693 m_WeaponState.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Insert(OnZoomChanged);
694 }
695
696 if (!sights)
697 {
698 m_WeaponState.m_Sights = null;
699 m_WeaponState.m_SightsZoomFOVInfo = null;
700 }
701 }
702
703 //------------------------------------------------------------------------------------------------
704 override protected void DisplayUpdate(IEntity owner, float timeSlice)
705 {
706 if (!m_wRoot || !m_WeaponState || !m_WeaponState.m_Weapon)
707 return;
708
709 if (m_eWeaponStateEvent != EWeaponFeature.NONE)
710 {
711 FadeElements();
712
713 m_eWeaponStateEvent = EWeaponFeature.NONE;
714
715 m_bFadeInOutActive = true;
716 };
717
719 return;
720
722 m_ZeroingAnimator.Update(timeSlice);
724 m_WeaponInfoPanelAnimator.Update(timeSlice);
725
726 // Print(string.Format("[ANIM STATES] m_WeaponInfoPanelAnimator: %1 | m_ZeroingAnimator: %2", m_WeaponInfoPanelAnimator.GetState(), m_ZeroingAnimator.GetState()));
727
729 }
730
731
732 //------------------------------------------------------------------------------------------------
733 protected void FadeElements()
734 {
735 // Weapon state debug
736 #ifdef WEAPON_INFO_DEBUG_STATES
737 string weaponStateDebug = "Weapon event flags: " + m_eWeaponStateEvent.ToString();
738
739 if (m_eWeaponStateEvent & EWeaponFeature.WEAPON)
740 weaponStateDebug += "|WEAPON";
741
742 if (m_eWeaponStateEvent & EWeaponFeature.MUZZLE)
743 weaponStateDebug += "|MUZZLE";
744
745 if (m_eWeaponStateEvent & EWeaponFeature.MAGAZINE)
746 weaponStateDebug += "|MAGAZINE";
747
748 if (m_eWeaponStateEvent & EWeaponFeature.AMMOCOUNT)
749 weaponStateDebug += "|AMMOCOUNT";
750
751 if (m_eWeaponStateEvent & EWeaponFeature.FIREMODE)
752 weaponStateDebug += "|FIREMODE";
753
754 if (m_eWeaponStateEvent & EWeaponFeature.ZEROING)
755 weaponStateDebug += "|ZEROING";
756
757 if (m_eWeaponStateEvent & EWeaponFeature.ADS)
758 weaponStateDebug += "|ADS";
759
760 if (m_eWeaponStateEvent & EWeaponFeature.MAGAZINE_COUNT)
761 weaponStateDebug += "|MAGAZINE_COUNT";
762
763 if (m_eWeaponStateEvent & EWeaponFeature.INSPECTION)
764 weaponStateDebug += "|INSPECTION";
765
766 if (m_eWeaponStateEvent & EWeaponFeature.ZOOM)
767 weaponStateDebug += "|ZOOM";
768
769 if (m_eWeaponStateEvent & EWeaponFeature.MISC)
770 weaponStateDebug += "|MISC";
771
772 Print(weaponStateDebug);
773 #endif
774
775 // Get some shared states / conditions for fading
776 //bool inspectingWeapon = m_CharacterController && m_CharacterController.GetIsInspectionMode();
777 bool isGrenade = m_WeaponState && m_WeaponState.m_bIsExplosive;
778 bool inADS = m_WeaponState && m_WeaponState.m_bInADS;
779 bool inInspection = m_WeaponState && m_WeaponState.m_bInInspectionMode;
780
781 // Main weapon UI (magazine, magazine count, firemode) fadein
782 bool panelVisibleEvent = m_eWeaponStateEvent != 0;
783 bool panelVisibleOverride = isGrenade || inADS || inInspection;
784 if (panelVisibleEvent || panelVisibleOverride)
785 m_WeaponInfoPanelAnimator.FadeIn(!panelVisibleOverride);
786
787 // Zeroing indicator fadein
788 bool zeroingWidgetHasText = !m_Widgets.m_wZeroingText.GetText().IsEmpty();
789 bool zeroingVisibleEvent = m_eWeaponStateEvent & (EWeaponFeature.ADS | EWeaponFeature.ZEROING | EWeaponFeature.MUZZLE | EWeaponFeature.WEAPON | EWeaponFeature.INSPECTION);
790 bool zeroingVisibleOverride = inADS || inInspection;
791 if (zeroingWidgetHasText && (zeroingVisibleEvent || zeroingVisibleOverride))
792 m_ZeroingAnimator.FadeIn(!zeroingVisibleOverride);
793 }
794
795 //------------------------------------------------------------------------------------------------
796 SCR_2DSightsComponent GetSights()
797 {
798 SightsComponent sights = m_WeaponManager.GetCurrentSights();
799
800 if (!sights)
801 return null;
802
803 return SCR_2DSightsComponent.Cast(sights);
804 }
805
806 //------------------------------------------------------------------------------------------------
808 {
809 if (!state)
810 return null;
811
813
814 if (state.m_Muzzle)
815 {
816 // WEAPON WITH MUZZLE
817 if (!state.m_MuzzleUI)
818 {
819 // No muzzle UI ?! Just hide it
820 config = null;
821 }
822 else
823 {
824
825 if (state.m_Magazine)
826 {
827 // MAGAZINE IS IN THE GUN
828 config = state.m_MagazineUI.m_MagIndicator;
829
830 if (!config)
831 config = state.m_MuzzleUI.m_MagIndicator;
832 }
833 else
834 {
835 // NO MAGAZINE
836 // Take mag configuration from muzzle
837
838 config = state.m_MuzzleUI.m_MagIndicator;
839 }
840 }
841 }
842 else
843 {
844 // NO MUZZLE, probably weapon must provide icon
845 if (state.m_WeaponUI)
846 {
847 config = state.m_WeaponUI.m_MagIndicator;
848 }
849 else
850 {
851 config = null;
852 }
853 }
854
855 return config;
856 }
857
858 //------------------------------------------------------------------------------------------------
860 {
861 if (!state || !m_Widgets)
862 return;
863
864 if (!state.m_MagazineConfig)
865 state.m_MagazineConfig = GetMagazineConfig(state);
866
867 SCR_MagazineIndicatorConfiguration config = state.m_MagazineConfig;
868
869 if (!config)
870 {
871 m_Widgets.m_wMagazineIndicator.SetVisible(false);
872 }
873 else
874 {
875 m_Widgets.m_wMagazineIndicator.SetVisible(true);
876
877 if (config.m_bProgressBar)
878 {
879 SetWidgetImage(m_Widgets.m_wMagazineOutline, config.m_sImagesetIcons, config.m_sOutline, SIZE_MAGAZINE);
880 SetWidgetImage(m_Widgets.m_wMagazineBackground, config.m_sImagesetIcons, config.m_sBackground, SIZE_MAGAZINE);
881 SetWidgetImage(m_Widgets.m_wMagazineGlow, config.m_sImagesetGlows, config.m_sBackground, SIZE_MAGAZINE);
882 }
883 else
884 {
885 SetWidgetImage(m_Widgets.m_wMagazineOutline, config.m_sImagesetIcons, config.m_sOutline, SIZE_MAGAZINE);
886 //SetWidgetImage(m_Widgets.m_wMagazineBackground, config.m_sImagesetIcons, config.m_sOutline, SIZE_MAGAZINE);
887 SetWidgetImage(m_Widgets.m_wMagazineGlow, config.m_sImagesetGlows, config.m_sOutline, SIZE_MAGAZINE);
888 }
889
890 // Setup textures for reloading indicator
891 SetWidgetImage(m_Widgets.m_wReloadBackground, config.m_sImagesetIcons, config.m_sProgress, SIZE_MAGAZINE);
892 m_Widgets.m_wReloadBackground.SetVisible(false);
893 SetWidgetImage(m_Widgets.m_wReloadOutline, config.m_sImagesetIcons, config.m_sOutline, SIZE_MAGAZINE);
894 m_Widgets.m_wReloadOutline.SetVisible(false);
895
896
897 // Setup visibility, keep only Outline texture, if there is no progress indication
898 m_Widgets.m_wMagazineProgress.SetVisible(config.m_bProgressBar && state.m_Magazine);
899 m_Widgets.m_wMagazineBackground.SetVisible(config.m_bProgressBar);
900 m_Widgets.m_wMagazineOutline.SetOpacity(1);
901
902 if (state.m_Magazine)
903 {
904 if (config.m_bProgressBar)
905 {
906 SetWidgetImage(m_Widgets.m_wMagazineProgress, config.m_sImagesetIcons, config.m_sProgress, SIZE_MAGAZINE);
907 m_Widgets.m_wMagazineProgress.LoadMaskFromSet(config.m_sImagesetIcons, config.m_sProgressAlphaMask);
908 m_Widgets.m_wMagazineProgress.SetMaskMode(ImageMaskMode.REGULAR);
909 }
910 }
911 else
912 {
913 if (!state.m_bIsExplosive)
914 m_Widgets.m_wMagazineOutline.SetOpacity(FADED_OPACITY);
915 }
916
917 //AnimateWidget_ColorFlash(m_Widgets.m_wMagazineIndicator);
918 }
919 }
920
921 //------------------------------------------------------------------------------------------------
923 {
924 if (!state || !m_Widgets)
925 return;
926
927 //AnimateWidget_ColorFlash(m_Widgets.m_wMagazineIndicator, EWeaponFeature.AMMOCOUNT);
928
929 m_Widgets.m_wMagazineProgress.SetMaskProgress(state.m_fMagAmmoPerc);
930 }
931
932 //------------------------------------------------------------------------------------------------
934 {
935 if (!state || !m_Widgets)
936 return;
937
938 int count = state.m_iMagCount;
939
940 // Add +1 if weapon is a grenade, so it shows the total # of grenades in possession
941 if (state.m_bIsExplosive)
942 count++;
943
944 string countText = count.ToString();
945
946 /*
947 if (!state.m_bIsExplosive)
948 countText = "+" + countText;
949 */
950
951 if (count > 0)
952 m_Widgets.m_wMagCountText.SetOpacity(1);
953 else
954 m_Widgets.m_wMagCountText.SetOpacity(FADED_OPACITY);
955
956 if (m_Widgets.m_wMagCountText.GetText() == countText)
957 return;
958
959 m_Widgets.m_wMagCountText.SetText(countText);
960
961 AnimateWidget_ColorFlash(m_Widgets.m_wMagCountText, EWeaponFeature.MAGAZINE_COUNT);
962 AnimateWidget_TextPopUp(m_Widgets.m_wMagCountText, 36, 54, EWeaponFeature.MAGAZINE_COUNT);
963 }
964
965 //------------------------------------------------------------------------------------------------
967 {
968 if (!state || !m_Widgets)
969 return;
970
971 if (state.m_bBarrelChambered)
972 m_Widgets.m_wFiremodeIcon.SetOpacity(1);
973 else
974 m_Widgets.m_wFiremodeIcon.SetOpacity(FADED_OPACITY);
975 }
976
977 //------------------------------------------------------------------------------------------------
979 {
980 if (!state || !m_Widgets)
981 return;
982
983 m_Widgets.m_wFiremodeIcon.SetVisible(false);
984 m_Widgets.m_wFiremodeGlow.SetVisible(false);
985
986 if (state.m_Muzzle && state.m_MuzzleUI && state.m_MuzzleUI.ShowFiremodeIcon())
987 {
988 EWeaponFiremodeType fm = state.m_FireModeType;
989 string icon = state.m_MuzzleUI.GetFiremodeIconName(fm);
990
991 if (icon != string.Empty)
992 {
993 SetWidgetImage(m_Widgets.m_wFiremodeIcon, state.m_MuzzleUI.GetFiremodeIconImageset(), icon, SIZE_FIREMODE);
994 SetWidgetImage(m_Widgets.m_wFiremodeGlow, state.m_MuzzleUI.GetFiremodeGlowImageset(), icon, SIZE_FIREMODE);
995
996 m_Widgets.m_wFiremodeIcon.SetVisible(true);
997 m_Widgets.m_wFiremodeGlow.SetVisible(true);
998
999 AnimateWidget_ColorFlash(m_Widgets.m_wFiremodeIcon, EWeaponFeature.FIREMODE);
1000 }
1001 }
1002 }
1003
1004 //------------------------------------------------------------------------------------------------
1006 {
1007 if (!state || !m_Widgets)
1008 return;
1009
1010 int zeroing = state.m_iZeroing;
1011
1012 if (zeroing <= 0)
1013 {
1014 m_Widgets.m_wZeroing.SetVisible(false);
1015 m_Widgets.m_wZeroingText.SetText(string.Empty);
1016 }
1017 else
1018 {
1019 m_Widgets.m_wZeroing.SetVisible(true);
1020 string sZeroing = string.Format("%1 m", zeroing);
1021 m_Widgets.m_wZeroingText.SetText(sZeroing);
1022
1023 AnimateWidget_ColorFlash(m_Widgets.m_wZeroing, EWeaponFeature.ZEROING);
1024 }
1025 }
1026
1027 //------------------------------------------------------------------------------------------------
1029 {
1030 if (!state || !m_Widgets)
1031 return;
1032
1033 float zoom = state.m_fZoom;
1034
1035 if (zoom <= 0 || !state.m_bInADS)
1036 {
1037 m_Widgets.m_wOptics.SetVisible(false);
1038 m_Widgets.m_wOpticsText.SetText(string.Empty);
1039 }
1040 else
1041 {
1042 string sZoom = zoom.ToString(-1,1);
1043 sZoom = string.Format("%1 ×", sZoom);
1044
1045 m_Widgets.m_wOptics.SetVisible(true);
1046 m_Widgets.m_wOpticsText.SetText(sZoom);
1047
1048 AnimateWidget_ColorFlash(m_Widgets.m_wOptics, EWeaponFeature.ZOOM);
1049 }
1050 }
1051
1052 //------------------------------------------------------------------------------------------------
1054 {
1055 if (!state || !m_Widgets)
1056 return;
1057
1058 if (!state.m_bHasSpecialAmmo || (!state.m_MagazineUI && !state.m_GrenadeUI))
1059 {
1060 m_Widgets.m_wAmmoType.SetVisible(false);
1061 return;
1062 }
1063
1064 string sAmmoTypeText;
1065 bool bShowAmmoTypeText;
1066
1067 if (state.m_GrenadeUI)
1068 {
1069 sAmmoTypeText = state.m_GrenadeUI.GetAmmoType();
1070 bShowAmmoTypeText = state.m_GrenadeUI.ShowAmmoTypeText();
1071 }
1072 else
1073 {
1074 sAmmoTypeText = state.m_MagazineUI.GetAmmoType();
1075 bShowAmmoTypeText = state.m_MagazineUI.ShowAmmoTypeText();
1076 }
1077
1078 if (!bShowAmmoTypeText)
1079 sAmmoTypeText = "";
1080
1081 m_Widgets.m_wAmmoTypeText.SetText(sAmmoTypeText);
1082
1083 m_Widgets.m_wAmmoType.SetVisible(true);
1084
1085 m_Widgets.m_wAmmoType_FMJ.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.FMJ);
1086 m_Widgets.m_wAmmoType_AP.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.AP);
1087 m_Widgets.m_wAmmoType_Frag.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.FRAG);
1088 m_Widgets.m_wAmmoType_Smoke.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.SMOKE);
1089 m_Widgets.m_wAmmoType_HE.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.HE);
1090 m_Widgets.m_wAmmoType_HEAT.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.HEAT);
1091 m_Widgets.m_wAmmoType_Incendiary.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.INCENDIARY);
1092 m_Widgets.m_wAmmoType_Tracer.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.TRACER);
1093 m_Widgets.m_wAmmoType_Sniper.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.SNIPER);
1094 m_Widgets.m_wAmmoType_Illumination.SetVisible(state.m_eAmmoTypeFlags & EAmmoType.ILLUMINATION);
1095
1096 //AnimateWidget_ColorFlash(m_Widgets.m_wAmmoType);
1097 }
1098
1099 //------------------------------------------------------------------------------------------------
1101 {
1102 if (!state || !m_Widgets || !state.m_WeaponUI)
1103 return;
1104
1105 // Update weapon name indicator
1106 bool showName = state.m_WeaponUI.ShowWeaponName();
1107
1108 if (showName)
1109 m_Widgets.m_wWeaponName.SetText(state.m_WeaponUI.GetName());
1110
1111 m_Widgets.m_wWeaponName.SetVisible(showName);
1112
1113 // Update muzzle caliber indicator
1114 bool showCaliber;
1115
1116 if (state.m_MuzzleUI)
1117 {
1118 showCaliber = state.m_MuzzleUI.ShowCaliber();
1119
1120 if (showCaliber)
1121 m_Widgets.m_wCaliber.SetText(state.m_MuzzleUI.GetCaliber());
1122 }
1123
1124 m_Widgets.m_wCaliber.SetVisible(showCaliber);
1125 }
1126
1127 //------------------------------------------------------------------------------------------------
1128 void AnimateWidget_ColorFlash(Widget w, EWeaponFeature requiredFlag = -1, float speed = UIConstants.FADE_RATE_SLOW)
1129 {
1130 if (!w)
1131 return;
1132
1133 if (requiredFlag != -1 && m_eWeaponStateEvent != requiredFlag)
1134 return;
1135
1136 w.SetColor(COLOR_ORANGE);
1137 AnimateWidget.Color(w, COLOR_WHITE, speed);
1138 }
1139
1140 //------------------------------------------------------------------------------------------------
1141 void AnimateWidget_TextPopUp(Widget w, float size, float sizeBoosted, EWeaponFeature requiredFlag = -1, float speed = UIConstants.FADE_RATE_SLOW)
1142 {
1143 if (!w)
1144 return;
1145
1146 if (requiredFlag != -1 && m_eWeaponStateEvent != requiredFlag)
1147 return;
1148
1149 float width = FrameSlot.GetSizeX(w);
1150
1151 FrameSlot.SetSize(w, width, sizeBoosted);
1152 float widthHeight[2] = {width, size};
1153 AnimateWidget.Size(w, widthHeight, speed);
1154 }
1155
1156 //------------------------------------------------------------------------------------------------
1157 override protected bool DisplayStartDrawInit(IEntity owner)
1158 {
1159 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(owner);
1160 if (!character)
1161 return false;
1162
1163 m_WeaponManager = character.GetWeaponManager();
1164 if (!m_WeaponManager)
1165 return false;
1166
1167 m_CompartmentAccess = SCR_CompartmentAccessComponent.Cast(character.GetCompartmentAccessComponent());
1169 return false;
1170
1171 m_MenuManager = GetGame().GetMenuManager();
1172 if (!m_MenuManager)
1173 return false;
1174
1175 // Register weapon related weapon event handlers
1176 AddEventHandlers(owner);
1177
1178 // Fallback in case the layout is not provided as an InfoDisplay attribute
1179 if (m_LayoutPath == string.Empty)
1180 m_LayoutPath = DEFAULT_WEAPON_INFO_LAYOUT;
1181
1182 return true;
1183 }
1184
1185 //------------------------------------------------------------------------------------------------
1186 override protected void DisplayStartDraw(IEntity owner)
1187 {
1188 if (!m_wRoot)
1189 return;
1190
1192 m_Widgets.Init(m_wRoot);
1193
1194 m_Widgets.m_wMagazineIndicator.SetVisible(true);
1195
1197 m_WeaponInfoPanelAnimator = new SCR_FadeInOutAnimator(m_Widgets.m_wWeaponInfoPanel, UIConstants.FADE_RATE_FAST, UIConstants.FADE_RATE_SLOW, FADEOUT_PANEL_DELAY, true);
1198
1199 if (!m_ZeroingAnimator)
1200 m_ZeroingAnimator = new SCR_FadeInOutAnimator(m_Widgets.m_wZeroing, UIConstants.FADE_RATE_FAST, UIConstants.FADE_RATE_SLOW, FADEOUT_OPTICS_DELAY, true);
1201
1202 // Initialize the UI based on what weapon character currently has
1203 OnWeaponChanged(m_WeaponManager.GetCurrentWeapon(), null);
1204 }
1205
1206 //------------------------------------------------------------------------------------------------
1207 override protected void DisplayStopDraw(IEntity owner)
1208 {
1209 if (m_WeaponState && m_WeaponState.m_SightsZoomFOVInfo)
1210 m_WeaponState.m_SightsZoomFOVInfo.GetEventOnZoomChanged().Remove(OnZoomChanged);
1211
1212 m_WeaponState = null;
1213
1214 // Un-register weapon related weapon event handlers
1215 RemoveEventHandlers(owner);
1216
1217 // Destroy the animators
1219 m_ZeroingAnimator = null;
1220
1221 m_wRoot = null;
1222 }
1223
1224 //------------------------------------------------------------------------------------------------
1225 // Called when the visibility flags no longer suspend the GUI; e.g. GM left and GUI marked as not to show in GM -> GUI can show again
1226 // Doesn't mean the GUI is visible, it is just not hidded due to visibility flags; use m_bShown to check the visibility
1227 override protected void DisplayOnResumed()
1228 {
1229 super.DisplayOnResumed();
1230
1231 if (m_WeaponManager)
1232 OnWeaponChanged(m_WeaponManager.GetCurrentWeapon(), null); // treat this as if we have changed the weapon, to properly reevaluate if we should show this HUD element
1233 }
1234
1235 //------------------------------------------------------------------------------------------------
1236 protected void AddEventHandlers(IEntity owner)
1237 {
1239 {
1240 m_EventHandlerManager.RegisterScriptHandler("OnWeaponChanged", this, OnWeaponChanged);
1241 m_EventHandlerManager.RegisterScriptHandler("OnMuzzleChanged", this, OnMuzzleChanged);
1242 m_EventHandlerManager.RegisterScriptHandler("OnMagazineChanged", this, OnMagazineChanged);
1243 m_EventHandlerManager.RegisterScriptHandler("OnMagazineCountChanged", this, OnMagazineCountChanged);
1244 m_EventHandlerManager.RegisterScriptHandler("OnAmmoCountChanged", this, OnAmmoCountChanged);
1245 m_EventHandlerManager.RegisterScriptHandler("OnFiremodeChanged", this, OnFiremodeChanged);
1246 m_EventHandlerManager.RegisterScriptHandler("OnZeroingChanged", this, OnZeroingChanged);
1247 m_EventHandlerManager.RegisterScriptHandler("OnADSChanged", this, OnADSChanged);
1248 m_EventHandlerManager.RegisterScriptHandler("OnInspectionModeChanged", this, OnInspectionModeChanged);
1249 m_EventHandlerManager.RegisterScriptHandler("OnWeaponAttachmentChanged", this, OnAttachmentChanged);
1250 }
1251 }
1252
1253 //------------------------------------------------------------------------------------------------
1254 protected void RemoveEventHandlers(IEntity owner)
1255 {
1257 {
1258 m_EventHandlerManager.RemoveScriptHandler("OnWeaponChanged", this, OnWeaponChanged);
1259 m_EventHandlerManager.RemoveScriptHandler("OnMuzzleChanged", this, OnMuzzleChanged);
1260 m_EventHandlerManager.RemoveScriptHandler("OnMagazineChanged", this, OnMagazineChanged);
1261 m_EventHandlerManager.RemoveScriptHandler("OnMagazineCountChanged", this, OnMagazineCountChanged);
1262 m_EventHandlerManager.RemoveScriptHandler("OnAmmoCountChanged", this, OnAmmoCountChanged);
1263 m_EventHandlerManager.RemoveScriptHandler("OnFiremodeChanged", this, OnFiremodeChanged);
1264 m_EventHandlerManager.RemoveScriptHandler("OnZeroingChanged", this, OnZeroingChanged);
1265 m_EventHandlerManager.RemoveScriptHandler("OnADSChanged", this, OnADSChanged);
1266 m_EventHandlerManager.RemoveScriptHandler("OnInspectionModeChanged", this, OnInspectionModeChanged);
1267 m_EventHandlerManager.RemoveScriptHandler("OnWeaponAttachmentChanged", this, OnAttachmentChanged);
1268 }
1269 m_EventHandlerManager = null;
1270 }
1271
1272 //------------------------------------------------------------------------------------------------
1275 {
1276 PlayerController pc = GetGame().GetPlayerController();
1277
1278 if (!pc)
1279 return null;
1280
1281 IEntity playerEntity = pc.GetControlledEntity();
1282
1283 if (!playerEntity)
1284 return null;
1285
1287
1288 CompartmentAccessComponent compAccess = CompartmentAccessComponent.Cast(playerEntity.FindComponent(CompartmentAccessComponent));
1289
1290 if (!compAccess)
1291 return invManager;
1292
1293 BaseCompartmentSlot compSlot = compAccess.GetCompartment();
1294
1295 if (!compSlot)
1296 return invManager;
1297
1298 IEntity vehEntity = compSlot.GetVehicle();
1301
1302 if (!vehInvMgr)
1303 {
1304 vehEntity = compSlot.GetOwner();
1306 }
1307
1308 if (!vehInvMgr)
1309 return null;
1310
1311 return vehInvMgr;
1312 }
1313
1314 //------------------------------------------------------------------------------------------------
1315 protected BaseWeaponManagerComponent GetWeaponManager(IEntity owner)
1316 {
1317 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(owner);
1318 if (!character)
1319 return null;
1320
1321 // Detect and store weapon manager
1322 BaseWeaponManagerComponent weaponManager = BaseWeaponManagerComponent.Cast(character.FindComponent(BaseWeaponManagerComponent));
1323 if (!weaponManager)
1324 return null;
1325
1326 return weaponManager;
1327 }
1328
1329 //---------------------------------------------------------------------------------------------------------
1331 protected void SetWidgetImage(ImageWidget w, string imageOrImageset, string imageName = "", int size = -1)
1332 {
1333 if (!imageName.IsEmpty())
1334 {
1335 // Assume it's an image set
1336 w.LoadImageFromSet(0, imageOrImageset, imageName);
1337 }
1338 else if (!imageOrImageset.IsEmpty())
1339 {
1340 // Assume it's an image
1341 w.LoadImageTexture(0, imageOrImageset);
1342 }
1343
1344 if (size == -1)
1345 return;
1346
1347 // Perform resizing
1348 int sx, sy;
1349 w.GetImageSize(0, sx, sy);
1350
1351 float ratio = sx / sy;
1352
1353 w.SetSize(size * ratio, size);
1354 }
1355};
ArmaReforgerScripted GetGame()
Definition game.c:1398
int size
SCR_AIInfoComponentClass SNIPER
Widget m_wRoot
EventHandlerManagerComponent m_EventHandlerManager
MenuManager m_MenuManager
void _print(string s)
enum EAmmoType INSPECTION
EAmmoType
@ AP
@ HE
@ SUBSONIC
@ HEAT
@ TRACER
@ FRAG
@ HEDP
@ FMJ
enum EAmmoType MAGAZINE
enum EAmmoType ZOOM
enum EAmmoType MISC
enum EAmmoType MAGAZINE_COUNT
enum EAmmoType ZEROING
enum EAmmoType FIREMODE
enum EAmmoType AMMOCOUNT
enum EAmmoType ADS
enum EAmmoType MUZZLE
static WidgetAnimationFrameSize Size(Widget widget, float size[2], float speed)
static WidgetAnimationColor Color(Widget widget, Color color, float speed)
Definition Color.c:13
bool ShowAmmoTypeText()
string GetAmmoType()
proto external Managed FindComponent(typename typeName)
proto external EntityPrefabData GetPrefabData()
bool ShowAmmoTypeText()
string GetAmmoType()
ref SCR_MagazineIndicatorConfiguration m_MagIndicator
bool ShowCaliber()
Definition MuzzleUIInfo.c:9
ResourceName GetFiremodeIconImageset()
ref SCR_MagazineIndicatorConfiguration m_MagIndicator
string GetFiremodeIconName(EWeaponFiremodeType firemode)
string GetCaliber()
bool ShowFiremodeIcon()
ResourceName GetFiremodeGlowImageset()
void SetWidgetImage(ImageWidget w, string imageOrImageset, string imageName="", int size=-1)
Sets widget's image to an image or imageset.
bool IsCurrentlyUsingWeapon(notnull BaseWeaponComponent weapon)
void OnMagazineCountChanged(BaseWeaponComponent weapon, int magazineCount, bool isGrenade)
void UpdateAmmoTypeIndicator(SCR_WeaponState state)
SCR_CompartmentAccessComponent m_CompartmentAccess
void OnMuzzleChanged_init(BaseWeaponComponent weapon)
const float FADEOUT_OPTICS_DELAY
void OnZoomChanged_init(BaseWeaponComponent weapon)
void OnMagazineChanged(BaseWeaponComponent weapon, BaseMagazineComponent magazine, BaseMagazineComponent prevMagazine)
void OnMagazineChanged_init(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle)
void AnimateWidget_TextPopUp(Widget w, float size, float sizeBoosted, EWeaponFeature requiredFlag=-1, float speed=UIConstants.FADE_RATE_SLOW)
void OnADSChanged_init(BaseWeaponComponent weapon)
const float FADEOUT_PANEL_DELAY
BaseWeaponManagerComponent m_WeaponManager
ref SCR_MagazinePredicate m_pMagazineSearchPredicate
const float FADEOUT_AMMO_TYPE_DELAY
void OnZeroingChanged_init(BaseWeaponComponent weapon)
void OnInspectionModeChanged(bool state)
void DisplayUpdate(IEntity owner, float timeSlice)
ref SCR_WeaponState m_WeaponState
const ResourceName DEFAULT_WEAPON_INFO_LAYOUT
EWeaponFeature m_eWeaponStateEvent
void OnFiremodeChanged(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle, BaseFireMode firemode)
void UpdateZoomIndicator(SCR_WeaponState state)
ref SCR_FadeInOutAnimator m_WeaponInfoPanelAnimator
void UpdateZeroingIndicator(SCR_WeaponState state)
BaseWeaponManagerComponent GetWeaponManager(IEntity owner)
void UpdateFireModeIndicator(SCR_WeaponState state)
static InventoryStorageManagerComponent GetInventoryManager()
Returns player's inventory manager, or vehicle's inv manager if player is in vehicle.
void DisplayStopDraw(IEntity owner)
bool DisplayStartDrawInit(IEntity owner)
void OnZeroingChanged(BaseWeaponComponent weapon, int zeroing)
SCR_InventoryStorageManagerComponent m_InventoryManager
SCR_MagazineIndicatorConfiguration GetMagazineConfig(SCR_WeaponState state)
void UpdateMagazineIndicator_Count(SCR_WeaponState state)
void AddEventHandlers(IEntity owner)
void OnWeaponChanged(BaseWeaponComponent weapon, BaseWeaponComponent prevWeapon)
void OnAmmoCountChanged_init(BaseWeaponComponent weapon, BaseMagazineComponent magazine)
void UpdateBulletInChamberIndicator(SCR_WeaponState state)
void OnFiremodeChanged_init(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle)
ref SCR_FadeInOutAnimator m_ZeroingAnimator
void UpdateMagazineIndicator_Progress(SCR_WeaponState state)
const ResourceName DEFAULT_MAGAZINE_INDICATOR
void AnimateWidget_ColorFlash(Widget w, EWeaponFeature requiredFlag=-1, float speed=UIConstants.FADE_RATE_SLOW)
SCR_2DSightsComponent GetSights()
void OnAmmoCountChanged(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle, BaseMagazineComponent magazine, int ammoCount, bool isBarrelChambered)
void UpdateWeaponNameAndCaliber(SCR_WeaponState state)
void UpdateMagazineIndicator_Textures(SCR_WeaponState state)
void OnZoomChanged(float zoom, float fov)
void RemoveEventHandlers(IEntity owner)
void OnMuzzleChanged(BaseWeaponComponent weapon, BaseMuzzleComponent muzzle, BaseMuzzleComponent prevMuzzle)
void OnMagazineCountChanged_init(BaseWeaponComponent weapon, BaseMagazineComponent magazine)
ref SCR_PrefabDataPredicate m_pPrefabDataPredicate
ref SCR_WeaponInfoWidgets m_Widgets
void OnAttachmentChanged(WeaponComponent weapon, bool isAttached, IEntity attachmentEntity)
void OnADSChanged(BaseWeaponComponent weapon, bool inADS)
void DisplayStartDraw(IEntity owner)
ref SCR_MagazineIndicatorConfiguration m_MagIndicator
bool ShowWeaponName()
Definition WeaponUIInfo.c:9
override void Show()
Definition gameLib.c:262
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
@ NONE
When Shape is created and not initialized yet.
Definition ShapeType.c:15
@ INCENDIARY
Definition EDamageType.c:21
@ RELOADING
ImageMaskMode
EWeaponFiremodeType