pluginuniversaltemperaturesourceclient.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. class PluginUniversalTemperatureSourceClient extends PluginBase
  2. {
  3. const int MAX_SIMULTANEOUS_UTS = 10;
  4. protected float m_UTSAverageTemperature;
  5. protected ref array<ref UTemperatureSourceDebug> m_UTemperatureSourceDebugs;
  6. protected ref Widget m_RootWidget[MAX_SIMULTANEOUS_UTS];
  7. protected TextListboxWidget m_StatListWidgets[MAX_SIMULTANEOUS_UTS];
  8. protected TextWidget m_HeaderWidget[MAX_SIMULTANEOUS_UTS];
  9. protected PlayerBase m_Player;
  10. void PluginUniversalTemperatureSourceClient()
  11. {
  12. m_UTemperatureSourceDebugs = new array<ref UTemperatureSourceDebug>();
  13. }
  14. override void OnInit()
  15. {
  16. #ifndef NO_GUI
  17. InitWidgets();
  18. #endif
  19. }
  20. override void OnUpdate(float delta_time)
  21. {
  22. #ifndef NO_GUI
  23. if (!m_Player)
  24. {
  25. return;
  26. }
  27. UpdateStatWidgets();
  28. DrawDebugs();
  29. #endif
  30. }
  31. void InitWidgets()
  32. {
  33. for (int i = 0; i < MAX_SIMULTANEOUS_UTS; i++)
  34. {
  35. m_RootWidget[i] = GetGame().GetWorkspace().CreateWidgets("gui/layouts/debug/day_z_debug_remoteinfo.layout");
  36. m_StatListWidgets[i] = TextListboxWidget.Cast(m_RootWidget[i].FindAnyWidget("TextListboxWidget0"));
  37. m_HeaderWidget[i] = TextWidget.Cast(m_RootWidget[i].FindAnyWidget("TextWidget0"));
  38. }
  39. }
  40. void DrawDebugs()
  41. {
  42. foreach (UTemperatureSourceDebug utsd : m_UTemperatureSourceDebugs)
  43. {
  44. float fullRange = utsd.GetValue(1).ToFloat();
  45. float maxRange = utsd.GetValue(2).ToFloat();
  46. float temp = utsd.GetValue(3).ToFloat();
  47. vector sphPos = utsd.GetValue(0).ToVector();
  48. int fullRangeColor = COLOR_RED_A;
  49. int maxRangeColor = COLOR_YELLOW_A;
  50. if (temp < 0)
  51. {
  52. fullRangeColor = COLOR_GREEN_A;
  53. maxRangeColor = COLOR_BLUE_A;
  54. }
  55. else if (temp == 0)
  56. {
  57. fullRangeColor = 0x1fefefef;
  58. maxRangeColor = 0x1fefefef;
  59. }
  60. Debug.DrawCylinder(sphPos, fullRange, fullRange, fullRangeColor, ShapeFlags.ONCE|ShapeFlags.TRANSP);
  61. Debug.DrawCylinder(sphPos, maxRange, maxRange, maxRangeColor, ShapeFlags.ONCE|ShapeFlags.TRANSP);
  62. Debug.DrawArrow(m_Player.GetPosition(), sphPos, 1.0, 0xffffffff, ShapeFlags.ONCE|ShapeFlags.TRANSP);
  63. }
  64. ProcessUniversalTemperatureSources();
  65. if (m_UTemperatureSourceDebugs.Count() > 0)
  66. {
  67. DbgUI.Begin("Universal Temp Sources", 10, 300);
  68. DbgUI.Text(string.Format("Lookup radius: %1m (server-side)", PluginUniversalTemperatureSourceServer.LOOKUP_RADIUS));
  69. DbgUI.Text(string.Format("Count: %1", m_UTemperatureSourceDebugs.Count()));
  70. DbgUI.Text(string.Format("Avg. temp: %1 °C", m_UTSAverageTemperature));
  71. DbgUI.End();
  72. }
  73. }
  74. protected void ProcessUniversalTemperatureSources()
  75. {
  76. if (m_UTemperatureSourceDebugs.Count() == 0)
  77. {
  78. m_UTSAverageTemperature = 0;
  79. return;
  80. }
  81. array<float> utsTemperatures = new array<float>();
  82. // get temperature from the source (based on distance), save it for min/max filtering
  83. foreach (UniversalTemperatureSourceDebug utsd : m_UTemperatureSourceDebugs)
  84. {
  85. //! next temp source is too far (not cleaned on server, like in Environment, client need to know about all sources in MAXRANGE)
  86. if (vector.DistanceSq(m_Player.GetPosition(), utsd.GetValue(0).ToVector()) > Math.SqrFloat(utsd.GetValue(2).ToFloat()))
  87. continue;
  88. utsTemperatures.Insert(CalcTemperatureFromTemperatureSource(utsd));
  89. }
  90. float min = MiscGameplayFunctions.GetMinValue(utsTemperatures);
  91. float max = MiscGameplayFunctions.GetMaxValue(utsTemperatures);
  92. if (max > 0 && min < 0)
  93. {
  94. m_UTSAverageTemperature = (max + min) * 0.5;
  95. }
  96. else
  97. {
  98. m_UTSAverageTemperature = max;
  99. }
  100. }
  101. protected float CalcTemperatureFromTemperatureSource(notnull UTemperatureSourceDebug utsd)
  102. {
  103. float distance = vector.Distance(m_Player.GetPosition(), utsd.GetValue(0).ToVector());
  104. distance = Math.Max(distance, 0.1); //min distance cannot be 0 (division by zero)
  105. float temperature = 0;
  106. //! heat transfer through air to player (env temperature)
  107. if (distance > utsd.GetValue(1).ToFloat())
  108. {
  109. float distFactor = Math.InverseLerp(utsd.GetValue(2).ToFloat(), utsd.GetValue(1).ToFloat(), distance);
  110. distFactor = Math.Max(distFactor, 0.0); //! dist factor minimum should be at 0
  111. temperature = utsd.GetValue(3).ToFloat() * distFactor;
  112. }
  113. else
  114. {
  115. temperature = utsd.GetValue(3).ToFloat();
  116. }
  117. //Print(temperature);
  118. return temperature;
  119. }
  120. void EnableWidgets(bool enable)
  121. {
  122. for (int i = 0; i < MAX_SIMULTANEOUS_UTS; i++)
  123. {
  124. m_RootWidget[i].Show(enable);
  125. }
  126. }
  127. void UpdateStatWidgets()
  128. {
  129. int i = 0;
  130. int utsDebugCount = m_UTemperatureSourceDebugs.Count();
  131. for (; i < utsDebugCount && i < MAX_SIMULTANEOUS_UTS; ++i)
  132. {
  133. UTemperatureSourceDebug utsd = m_UTemperatureSourceDebugs[i];
  134. vector pos = utsd.GetValue(0).ToVector();
  135. vector screen_pos_stats = GetGame().GetScreenPos(pos + "0 0 0");
  136. vector screen_pos_damage = GetGame().GetScreenPos(pos + "0 2 0");
  137. m_RootWidget[i].SetPos(screen_pos_stats[0], screen_pos_stats[1]);
  138. if (screen_pos_stats[2] > 0 && screen_pos_stats[0] > 0 && screen_pos_stats[1] > 0)
  139. {
  140. m_RootWidget[i].Show(true);
  141. UpdateStatWidget(i, utsd);
  142. }
  143. else
  144. {
  145. m_RootWidget[i].Show(false);
  146. }
  147. }
  148. for (; i < MAX_SIMULTANEOUS_UTS; ++i)
  149. {
  150. if (m_RootWidget[i])
  151. {
  152. m_RootWidget[i].Show(false);
  153. }
  154. }
  155. }
  156. void UpdateStatWidget(int rowIndex, UTemperatureSourceDebug utsd)
  157. {
  158. m_StatListWidgets[rowIndex].ClearItems();
  159. m_HeaderWidget[rowIndex].SetText(utsd.GetHeader());
  160. int numPairs = utsd.PairsCount();
  161. for (int i = 0; i < numPairs; ++i)
  162. {
  163. m_StatListWidgets[rowIndex].AddItem(utsd.GetName(i), null, 0, i);
  164. m_StatListWidgets[rowIndex].SetItem(i, utsd.GetValue(i), null, 1);
  165. }
  166. // manually add value for distance (client only)
  167. m_StatListWidgets[rowIndex].AddItem("distance", null, 0, numPairs);
  168. m_StatListWidgets[rowIndex].SetItem(numPairs, vector.Distance(m_Player.GetPosition(), utsd.GetValue(0).ToVector()).ToString(), null, 1);
  169. }
  170. void RequestUniversalTemperatureSources(PlayerBase player, int enable)
  171. {
  172. //Debug.Log("RequestUniversalTemperatureSources called", "PluginUniversalTemperatureSourceClient");
  173. if (!enable)
  174. {
  175. m_UTemperatureSourceDebugs.Clear();
  176. m_Player = null;
  177. EnableWidgets(false);
  178. return;
  179. }
  180. ScriptRPC rpc = new ScriptRPC();
  181. rpc.Write(enable);
  182. rpc.Send(player, ERPCs.DEV_REQUEST_UTS_DEBUG, true, player.GetIdentity());
  183. m_Player = player;
  184. }
  185. void PrintedDebug()
  186. {
  187. foreach (UTemperatureSourceDebug utsd : m_UTemperatureSourceDebugs)
  188. {
  189. PrintString("-------------------------------------");
  190. utsd.Debug();
  191. PrintString("-------------------------------------");
  192. }
  193. }
  194. void OnRPC(ParamsReadContext ctx)
  195. {
  196. //Debug.Log("OnRPC called", "PluginUniversalTemperatureSourceClient");
  197. //PrintedDebug();
  198. ctx.Read(m_UTemperatureSourceDebugs);
  199. }
  200. }