boathud.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Boat HUD UI
  2. class BoatHud : VehicleHudBase
  3. {
  4. protected const float ENGINE_BLINK_DURATION = 3;
  5. protected ImageWidget m_SpeedPointer;
  6. protected ImageWidget m_EngineLight;
  7. protected ImageWidget m_FuelLight;
  8. protected bool m_HasEngine;
  9. protected int m_EngagedGear;
  10. protected int m_EngineHealthLevel;
  11. protected float m_FuelLevel;
  12. protected float m_TimeSinceEngineHit;
  13. protected float m_TimeSinceEngineBlink;
  14. protected BoatScript m_CurrentVehicle;
  15. protected ref WidgetFadeTimer m_FadeTimer = new WidgetFadeTimer();
  16. override void Init(Widget vehicleHudPanels)
  17. {
  18. super.Init(vehicleHudPanels);
  19. m_VehiclePanel = GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_hud_boats.layout", vehicleHudPanels);
  20. m_SpeedPointer = ImageWidget.Cast( m_VehiclePanel.FindAnyWidget("SpeedPointer") );
  21. m_EngineLight = ImageWidget.Cast( m_VehiclePanel.FindAnyWidget("EngineLight"));
  22. m_FuelLight = ImageWidget.Cast( m_VehiclePanel.FindAnyWidget("FuelLight"));
  23. m_VehicleCurrentGearValue = TextWidget.Cast( m_VehiclePanel.FindAnyWidget("Current") );
  24. m_VehicleNextGearValue = TextWidget.Cast( m_VehiclePanel.FindAnyWidget("Next") );
  25. m_VehiclePrevGearValue = TextWidget.Cast( m_VehiclePanel.FindAnyWidget("Prev") );
  26. }
  27. override void ShowVehicleInfo(PlayerBase player)
  28. {
  29. HumanCommandVehicle hcv = player.GetCommand_Vehicle();
  30. if (!hcv)
  31. return;
  32. m_CurrentVehicle = BoatScript.Cast(hcv.GetTransport());
  33. m_VehiclePanel.Show(true);
  34. m_EngineHealthLevel = -1;
  35. m_FuelLevel = -1;
  36. if (m_CurrentVehicle.HasEngine())
  37. m_HasEngine = true;
  38. float gearNeutral = m_CurrentVehicle.GetNeutralGear();
  39. m_VehicleGearTable.Set(gearNeutral - 2, "");
  40. m_VehicleGearTable.Set(gearNeutral - 1, "R");
  41. m_VehicleGearTable.Set(gearNeutral, "N");
  42. m_VehicleGearTable.Set(gearNeutral + 1, "F");
  43. m_VehicleGearTable.Set(gearNeutral + 2, "");
  44. m_EngagedGear = -10; // force initial update
  45. }
  46. override void HideVehicleInfo()
  47. {
  48. m_CurrentVehicle = null;
  49. m_VehicleGearTable.Clear();
  50. }
  51. override void RefreshVehicleHud(float timeslice)
  52. {
  53. int engineHealthLevel = m_CurrentVehicle.GetHealthLevel("Engine");
  54. float fuelFraction = m_CurrentVehicle.GetFluidFraction(BoatFluid.FUEL);
  55. if (m_EngineHealthLevel != engineHealthLevel)
  56. UpdateEngineIcon(engineHealthLevel);
  57. if (m_FuelLevel != fuelFraction)
  58. UpdateFuelIcon(fuelFraction);
  59. if (m_CurrentVehicle.HasEngineZoneReceivedHit())
  60. m_TimeSinceEngineHit = ENGINE_BLINK_DURATION;
  61. if (m_TimeSinceEngineHit > 0)
  62. UpdateEngineBlink(timeslice);
  63. UpdateSpeedPointer();
  64. UpdateGear();
  65. }
  66. protected void UpdateEngineIcon(int level)
  67. {
  68. m_EngineHealthLevel = level;
  69. if (m_EngineHealthLevel <= GameConstants.STATE_WORN)
  70. {
  71. m_EngineLight.SetColor(COLOR_WHITE);
  72. m_EngineLight.SetAlpha(0);
  73. }
  74. else if (m_EngineHealthLevel > GameConstants.STATE_WORN)
  75. {
  76. m_EngineLight.SetColor(ItemManager.GetItemHealthColor(m_EngineHealthLevel));
  77. m_EngineLight.SetAlpha(1);
  78. }
  79. }
  80. protected void UpdateFuelIcon(float level)
  81. {
  82. m_FuelLevel = level;
  83. if (m_FuelLevel > 0.45)
  84. {
  85. m_FuelLight.SetAlpha(0);
  86. return;
  87. }
  88. else if (m_FuelLevel > 0.15)
  89. m_FuelLight.SetColor(Colors.COLOR_DAMAGED);
  90. else if (m_FuelLevel > 0)
  91. m_FuelLight.SetColor(Colors.COLOR_BADLY_DAMAGED);
  92. else
  93. m_FuelLight.SetColor(Colors.COLOR_RUINED);
  94. m_FuelLight.SetAlpha(1);
  95. }
  96. protected void UpdateSpeedPointer()
  97. {
  98. if (m_HasEngine)
  99. {
  100. float min, max, current;
  101. min = 0;
  102. max = m_CurrentVehicle.EngineGetRPMMax();
  103. current = Math.Clamp(m_CurrentVehicle.EngineGetRPM(), min, max);
  104. float percentVal = Math.InverseLerp(min, max, current);
  105. m_SpeedPointer.SetRotation(0, 0, Math.Lerp(225, 495, Math.AbsFloat(percentVal)), true);
  106. }
  107. }
  108. protected void UpdateGear()
  109. {
  110. if (!m_HasEngine)
  111. return;
  112. int gear = m_CurrentVehicle.GetGear();
  113. if (m_EngagedGear == gear)
  114. return;
  115. m_EngagedGear = gear;
  116. m_VehiclePrevGearValue.SetText(m_VehicleGearTable.Get(m_EngagedGear - 1));
  117. m_VehicleCurrentGearValue.SetText(m_VehicleGearTable.Get(m_EngagedGear));
  118. m_VehicleNextGearValue.SetText(m_VehicleGearTable.Get(m_EngagedGear + 1));
  119. }
  120. protected void UpdateEngineBlink(float timeSlice)
  121. {
  122. m_TimeSinceEngineHit -= timeSlice;
  123. if (m_TimeSinceEngineHit <= 0)
  124. {
  125. m_FadeTimer.Stop();
  126. m_EngineLight.SetAlpha(1);
  127. return;
  128. }
  129. m_TimeSinceEngineBlink -= timeSlice;
  130. if (m_TimeSinceEngineBlink <= 0)
  131. {
  132. m_TimeSinceEngineBlink = 0.35;
  133. if (m_EngineLight.GetAlpha() == 0)
  134. m_FadeTimer.FadeIn(m_EngineLight, 0.1);
  135. else
  136. m_FadeTimer.FadeOut(m_EngineLight, 0.1);
  137. }
  138. }
  139. protected float GetSpeedometer()
  140. {
  141. vector transform[4];
  142. m_CurrentVehicle.GetTransform(transform);
  143. return GetVelocity(m_CurrentVehicle).InvMultiply3(transform)[2];
  144. }
  145. }